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

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

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

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

Q&A

解決済

3回答

1833閲覧

beautifulsoupでxmlの解析をしたいですが、うまく取得できずに困ってしまいました。

退会済みユーザー

退会済みユーザー

総合スコア0

XML

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

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python

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

0グッド

0クリップ

投稿2021/11/19 10:49

編集2021/11/19 10:56

初めまして。
初心者ですが、beautifulsoupでxmlの解析をしております。
もしどなたかご存知でしたらお教えいただけると嬉しいです。

###行いたいこと
下記XMLからxsi:typeを指定して、『159』を取り出したいです。
<dc:subject xsi:type="dcndl:NDC9">159</dc:subject>

###試したこと
下記のコマンドでは表示されませんでした。
print(soup.find('dcndl:NDC9').text)

###お聞きしたいこと
どのようなコマンドで取得できますでしょうか?
また、xsi:typeはxmlの名前空間というものなのでしょうか?

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

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

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

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

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

guest

回答3

0

以下の様な内容の XML ファイルがあるとして、

search_result.xml

xml

1<records> 2 <record> 3 <recordSchema>info:srw/schema/1/dc-v1.1</recordSchema> 4 <recordPacking>string</recordPacking> 5 <recordData> 6 <dc:title>タイトル</dc:title> 7 <dc:creator>著者</dc:creator> 8 <dc:publisher>出版社</dc:publisher> 9 <dcndl:price>686円</dcndl:price> 10 <dcterms:extent>606p ; 16cm</dcterms:extent> 11 <dc:identifier xsi:type="dcndl:ISBN">XXXXXXXX</dc:identifier> 12 <dc:subject xsi:type="dcndl:NDLC">ABCD</dc:subject> 13 <dc:subject xsi:type="dcndl:NDC9">159</dc:subject> 14 <dcndl:materialType>図書</dcndl:materialType> 15 <rdfs:seeAlso rdf:resource="http://id.ndl.go.jp/bib/00000000"></rdfs:seeAlso> 16 <dcndl:publicationPlace xsi:type="dcterms:ISO3166">JP</dcndl:publicationPlace> 17 <dc:language xsi:type="ISO639-2">jpn</dc:language></dcndl_simple:dc> 18 </recordData> 19 <recordPosition>1</recordPosition> 20 </record> 21</records>

soup.select_one を使います。

python

1from bs4 import BeautifulSoup 2 3with open('search_result.xml') as f: 4 soup = BeautifulSoup(f, 'xml') 5 6print(soup.select_one('[type="dcndl:NDC9"]').text) 7 8# 9159

投稿2021/11/19 17:35

melian

総合スコア20655

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

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

退会済みユーザー

退会済みユーザー

2021/11/20 02:43 編集

ご回答ありがとうございます。 soup.select_one() というコマンドを初めて見ました。 このような指定方法があるのですね。 xmlファイルの参考例まで持ってきていただき、 大変見やすく勉強になりました。 高評価をたくさん押させていただきたいほどです。 ありがとうございました。
退会済みユーザー

退会済みユーザー

2021/11/20 02:44

一つお聞きしたいのですが、 select_one()コマンドの中に、 xsi: はなぜ含めなくても大丈夫なのでしょうか?
melian

2021/11/20 02:55

実は xsi(namespace prefix)を付けるとエレメントを抽出できません。prefix を指定しないか、"*" にすると抽出できます。 soup.select_one('[*|type="dcndl:NDC9"]') つまり、現状では属性に対して namespace prefix を明示的に指定できない仕様の様です。
退会済みユーザー

退会済みユーザー

2021/11/20 03:19

仕様でそのようになっているのですね。 追加のご解説までしていただき大変勉強になりました。 どうもありがとうございました。
guest

0

ベストアンサー

print(soup.find('dcndl:NDC9').text)

だと、dcndl:NDC9というノードを検索します。xsi:type属性を見ないと。

Python

1print(soup.find(attrs={"xsi:type":"dcndl:NDC9"}).text)

投稿2021/11/19 15:15

otn

総合スコア85901

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

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

退会済みユーザー

退会済みユーザー

2021/11/20 02:37

ご回答いただきありがとうございます。 ノードを検索するのでなく、attrs={"属性名","値"}で検索しているのですね。 大変助かりました。 簡潔にわかりやすく教えていただき、とても勉強になりました。
guest

0

ここまで絞れていればtextを取るだけではないのですか。

python

1>>> print(soup) 2<html><body><dc:subject xsi:type="dcndl:NDC9">159</dc:subject></body></html> 3>>> print(soup.text) 4159

投稿2021/11/19 11:15

ppaul

総合スコア24670

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

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

退会済みユーザー

退会済みユーザー

2021/11/20 02:34

ありがとうございます。 すみません、質問の仕方がよろしくなかったかもしれません、 そこまで絞り込む方法をお聞きしたかったので、xmlを貼った方がわかりやすかったですね。 以後気をつけます。 ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問