[Python]XMLの解析について
ニコ生のapiの結果がXML形式で取得でき、それの必要な要素を取り出したいです。
lxml.htmlやxml.etree.ElementTreeをimportし試してみましたがどれもエラーが出てしまい望む結果が得られませんでした。また、XMLを解析する方法ではなく、スクレイピングで該当する要素を取り出そうとしましたができませんでした。
xpathでは以下のようなコードを書きました。
dom = lxml.html.fromstring(body) contents = dom.xpath("//*[@id=\"collapsible5\"]/div[1]/div[2]/span")
これを実行しても空要素で望む結果を得られませんでした。
行いたいこと・ニコニコ生放送のAPIについて
ニコニコ生放送には、番組情報を取得するAPIとしてgetplayerstatusというapiがあります。以下のように使うことができます。
http://live.nicovideo.jp/api/getplayerstatus?v=lv{番組id}
このapiの結果は以下のようになります。
xxx
この結果の中から、以下の部分を取得したいと考えています。
<ticket>71289224:lv311038136:0:139239522:59vh8328ee4f</ticket>
ニコ生APIの叩き方について
ニコ生のapiはログインした状態でないとapiを叩くことができないので以下のコードでapiを叩くことができます。apiを叩くにはニコニコ生放送のアカウントが必要です。以下のコードを実行すると指定した番組idのgetplayerstatusのapi結果が帰ってきます。
#!/usr/bin/python #coding:utf-8 import sys, urllib2 import urllib import os.path import os import re import cookielib import time from bs4 import BeautifulSoup import xml.etree.ElementTree as Xml import requests import httplib import lxml.html from xml.etree import ElementTree mail = "" password = "" headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; ja; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)', 'Accept': '*/*', 'Accept-Language': 'ja,en-us;q=0.7,en;q=0.3', 'Accept-Charset': 'UTF-8,*', 'Connection': 'keep-alive', 'Keep-Alive': '300', 'Cookie': '; '} #ログイン処理 post_dict ={'show_button_facebook':'1', 'next_url':'', 'mail':mail, 'password':password } headers['Referer']='https://account.nicovideo.jp/' headers['Content-type']='application/x-www-form-urlencoded'; conn = httplib.HTTPSConnection('account.nicovideo.jp') conn.request('POST','/api/v1/login?show_button_twitter=1&site=niconico',urllib.urlencode(post_dict),headers) rs = conn.getresponse() mc = re.compile('(user_session=(?!deleted)[^;]*);?').search(rs.getheader('Set-Cookie')) user_session = mc.group(1) headers['Cookie'] = user_session rs.read() rs.close() conn.close() liveid = 'lv3{番組id}' conn = httplib.HTTPConnection('live.nicovideo.jp', 80) conn.request('GET', '/api/getplayerstatus/%s' % liveid, '', headers) body = conn.getresponse().read() rs.close() conn.close() print body
スクレイピングでも、XMLでもどちらでも構いませんので取得の方法を教えていただけると嬉しいです。
追記
具体的に、ElementTreeを使いtagを取得することができましたが、
elem = ElementTree.fromstring(body) print elem.tag
上記のコードを実行すると、getplayerstatusという結果は帰ってきますが、
<ticket>71289224:lv311038136:0:139239522:59vh8328ee4f</ticket>
の部分を取得するコードの書き方がわかりません。
回答2件
あなたの回答
tips
プレビュー