質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

827閲覧

[Python]XMLの解析について。指定した要素を取り出したい。

teratail1111

総合スコア7

XML

XMLは仕様の1つで、マークアップ言語群を構築するために使われています。

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

XPath(XML Path)

XML Path Language (XPath; XMLパス言語)は、マークアップ言語 XML に準拠した文書の特定の部分を指定する言語構文の事をいいます。XPathはXMLとは別の構文を使用します。XMLドキュメントの抽象、論理ストラクチャ上で動作します。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/02/14 14:11

編集2018/02/14 15:07

[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>の部分を取得するコードの書き方がわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

unz.hori

2018/02/14 14:56

"python XML パース"でググるとxml.etree.ElementTreeの例が多いですね。取得できるデータをちゃんとxml形式にして与えればパースできそうな気がします。 やってみた時の具体例(エラー情報)などを記載すれば回答がつくと思いますが...
teratail1111

2018/02/14 14:58

追記してみます。ありがとうおざいます。
guest

回答2

0

ベストアンサー

タグの階層がgetplayerstatus -> rtmp -> ticket なため、そのように指定する必要があります。
以下はBeautifulSoupを使ったサンプルです。

Python

1from bs4 import BeautifulSoup 2 3soap = BeautifulSoup(body, 'lxml') 4print(soap.getplayerstatus.rtmp.ticket)

■余談
conn.close()やrs.close()などはcontextlib#closingを使うとclose忘れを防げます。

Python

1from contextlib import closing 2 3with closing(conn.getresponse()) as rs: 4 # rsで行いたい処理

投稿2018/02/14 17:07

編集2018/02/14 17:09
umyu

総合スコア5846

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

>getplayerstatusという結果は帰ってきます
getplayerstatusという結果は返ってきます
PythonでElementTreeを使ってXMLを処理する方法
ちょっと古いですが、この辺りで参考になりませんか?

投稿2018/02/14 15:16

unz.hori

総合スコア1057

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teratail1111

2018/02/14 15:58

``` elem = ElementTree.fromstring(body) print elem.get("ticket") ``` のコードを実行しても、Noneとしか帰ってこず、 ``` tree = Xml.parse(body) elem = tree.getroot() ``` を実行しても、 ``` Traceback (most recent call last): File "nico.py", line 81, in <module> tree = Xml.parse(body) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1182, in parse tree.parse(source, parser) File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 647, in parse source = open(source, "rb") ``` といったエラーが表示され実行できない状態です。
unz.hori

2018/02/14 16:01

そもそも渡しているbodyの中身ってどんなんですか?
teratail1111

2018/02/14 16:06

上の方に書いてある、「このapiの結果は以下のようになります。」が中身です。
unz.hori

2018/02/14 16:09

それって正しいxml形式ではないですよね?。正しいxml形式になるように補正してみるとどうなりますか? 例えば、先頭に <?xml version="1.0"?> <data> を付けて最後に </data>を付けてみるとか
teratail1111

2018/02/14 16:20

すみません。ブラウザを通しては上記の通りでしたが、データとしては、<?xml version="1.0" encoding="utf-8"?>から始まっていました。
unz.hori

2018/02/14 16:25

なるほどー。でわ質問に上記のエラー部分を追記して有識者の回答を待ってくださいー
unz.hori

2018/02/14 16:26

おぢさんもそろそろ燃料が切れて眠らねばなりませんw
teratail1111

2018/02/14 16:32

親切にありがとうございました。 getrootを使った場合エラーはでますが、getrootを使わずelem = ElementTree.fromstring(body)を実行することでtagは取得できているので、指定の仕方で取得できるのではないかと思っています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問