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

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

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

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

Python

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

Q&A

解決済

2回答

1747閲覧

pythonでXMLファイルの解析をしたいのですが、どのように指定すれば当該の情報を抜き出せるのかわからず質問させていただきました。

退会済みユーザー

退会済みユーザー

総合スコア0

XML

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

Python

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

0グッド

0クリップ

投稿2021/11/14 03:31

前提・実現したいこと

初めまして。xml初心者でして、pythonでxmlファイルから図書情報を取得することができず困ってしまったため、
質問させていただきました。
具体的には、下記のxmlファイルから、タイトルや画像を取得したいと考えています。(空想科学読本というタイトル)
どなた様か教えていただけたら幸いです。

下記は解析したいXMLファイル↓

xml

1<searchRetrieveResponse xmlns="http://www.loc.gov/zing/srw/"> 2<version>1.2</version> 3<numberOfRecords>1</numberOfRecords> 4<nextRecordPosition>0</nextRecordPosition> 5<extraResponseData> <facets> <lst name="REPOSITORY_NO"> <int name="R100000001">1</int> </lst> <lst name="NDC"> <int name="4">1</int> </lst> <lst name="ISSUED_DATE"> <int name="2006">1</int> </lst> <lst name="LIBRARY"> <int name="さいたま市立中央図書館">1</int> <int name="和歌山県立図書館">1</int> </lst> </facets> </extraResponseData> 6<records> 7<record> 8<recordSchema>info:srw/schema/1/dc-v1.1</recordSchema> 9<recordPacking>string</recordPacking> 10<recordData> <srw_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:srw_dc="info:srw/schema/1/dc-v1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="info:srw/schema/1/dc-v1.1 http://www.loc.gov/standards/sru/dc-schema.xsd"> <dc:title>空想科学読本</dc:title> <dc:creator>柳田 理科雄 著</dc:creator> <dc:subject>科学</dc:subject> <dc:subject>テレビドラマ</dc:subject> <dc:subject>アニメーション</dc:subject> <dc:description>新装版</dc:description> <dc:description>第17刷 2014.8</dc:description> <dc:publisher>KADOKAWA</dc:publisher> <dc:language>jpn</dc:language> </srw_dc:dc> </recordData> 11<recordPosition>1</recordPosition> 12</record> 13</records> 14</searchRetrieveResponse>

発生している問題・エラーメッセージ

①タグ名に不要な情報がついている。
下記でprintした結果、表示されるタグの前に、「{http://www.loc.gov/zing/srw/}」というURLがついてしまいます。
例){http://www.loc.gov/zing/srw/}version

python

1for child in root: 2 print(child.tag)

②上記のためか、child.iter("タグ名")でデータの抜き出しができない。

③上記問題も含めて考えたときに、図書タイトルや画像を取りたいときは、具体的にはどのようなコードで抜き出せますでしょうか?

該当のソースコード

python

1import xml.etree.ElementTree as ET 2 3# XMLデータの読み込み 4tree = ET.parse('/Users/user/Documents/python/kaien_library_project/librarypro/api_test/sru.xml') 5root = tree.getroot() 6 7for child in root: 8 print(child.tag, child.attrib)

どうぞ、よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

表示されるタグの前に、「{http://www.loc.gov/zing/srw/}」というURL

namespace URI と呼ばれているもので、xml.etree.ElementTree でノードを検索する際に namespace 名と対にして指定します。

python

1import xml.etree.ElementTree as ET 2 3xml_file = 'sru.xml' 4 5# gather all namespaces 6ns = dict([node for _, node in ET.iterparse(xml_file, events=['start-ns'])]) 7 8tree = ET.parse(xml_file) 9root = tree.getroot() 10 11for child in root.findall('.//dc:title', namespaces=ns): 12 print(child.text) 13 14_ = ''' 15空想科学読本 16'''

lxml パッケージを使うと XML ファイルを二度読みしなくてよいので、そちらの利用をお薦めします。

ちなみに、dc namespace の全ての要素を取得する場合は以下の様にします。

python

1for child in root.findall('.//dc:*', namespaces=ns): 2 print(child.tag.split('}', 1)[1], child.text) 3 4_ = ''' 5title 空想科学読本 6creator 柳田 理科雄 著 7subject 科学 8subject テレビドラマ 9subject アニメーション 10description 新装版 11description 第17刷 2014.8 12publisher KADOKAWA 13language jpn 14'''

投稿2021/11/14 05:24

編集2021/11/14 05:28
melian

総合スコア20574

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

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

退会済みユーザー

退会済みユーザー

2021/11/14 08:30 編集

ご丁寧にご回答をいただきありがとうございます。 namespace URI という名前なのですね、教えていただき知ることができました。 申し訳ないのですが、ご回答に関して1文わからなかったのでお聞きしても良いですか? ns = dict([node for _, node in ET.iterparse(xml_file, events=['start-ns'])]) このコマンドがどんな内容の処理を行なっているかが難しく、大変勉強不足で申し訳ないのですが、 もし解説をお聞きできたら嬉しいです。
melian

2021/11/14 08:38

元の XML ドキュメントには複数の異なる namespace が使われています。それらを全て抽出して辞書形式にしています。 ET.iterparse(xml_file, events=['start-ns']) では XML ドキュメントの全てのノードを調べて namespace から始まっているノードだけを抽出します。そして list comprehension で必要な部分だけを取り出しています。
退会済みユーザー

退会済みユーザー

2021/11/14 11:18

コメントへのメール通知がないことを知らず遅くなりすみません、 ご丁寧に解説いただきありがとうございます。 1行で上記の処理を全て記載することができるとは…とても勉強になりました。 お返事も早くくださり感謝です。
guest

0

BeautifulSoupを使うと以下です。

python

1>>> from bs4 import BeautifulSoup 2>>> soup = BeautifulSoup(xml) 3>>> print(soup) 4<html><body><searchretrieveresponse xmlns="http://www.loc.gov/zing/srw/"> 5<version>1.2</version> 6<numberofrecords>1</numberofrecords> 7<nextrecordposition>0</nextrecordposition> 8<extraresponsedata> <facets> <lst name="REPOSITORY_NO"> <int name="R100000001">1</int> </lst> <lst name="NDC"> <int name="4">1</int> </lst> <lst name="ISSUED_DATE"> <int name="2006">1</int> </lst> <lst name="LIBRARY"> <int name="さいたま市 立中央図書館">1</int> <int name="和歌山県立図書館">1</int> </lst> </facets> </extraresponsedata> 9<records> 10<record> 11<recordschema>info:srw/schema/1/dc-v1.1</recordschema> 12<recordpacking>string</recordpacking> 13<recorddata> <srw_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:srw_dc="info:srw/schema/1/dc-v1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="info:srw/schema/1/dc-v1.1 http://www.loc.gov/standards/sru/dc-schema.xsd"> <dc:title>空想科学読本</dc:title> <dc:creator>柳田 理科雄 著</dc:creator> <dc:subject>科学</dc:subject> <dc:subject>テレビドラマ</dc:subject> <dc:subject>アニメーション</dc:subject> <dc:description>新装版</dc:description> <dc:description>17刷 2014.8</dc:description> <dc:publisher>KADOKAWA</dc:publisher> <dc:language>jpn</dc:language> </srw_dc:dc> </recorddata> 14<recordposition>1</recordposition> 15</record> 16</records> 17</searchretrieveresponse></body></html> 18>>> print(soup.find('dc:title').text) 19空想科学読本

投稿2021/11/14 03:46

ppaul

総合スコア24668

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

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

退会済みユーザー

退会済みユーザー

2021/11/14 08:15

とても早く回答をいただきありがとうございます。 beautifulsoupはxmlを解析するのにも用いられるのですね。勉強になります。 find('dc:title') のコマンドで指定することで拾ってこれるとは大変驚きました。 とてもスマートな方法ですね、実践してみます! ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問