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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1136閲覧

BeautifulSoupで複数のタグと属性を組み合わせてfind_allする方法を教えてください

MonTesra

総合スコア3

XML

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/12/22 10:47

xmlファイル内にある以下のようなデータから、
<data-report test-id = 123456 factor = A>
<data-info name = ABC number="20" effect="5600" cost="1000">
<data-info name = BCD number="50" effect="7600" cost="1500">
<data-info name = DEF number="70" effect="5200" cost="1800">

それぞれのタプルの先頭にtest-idが含まれる以下のようなリストを作成したいと考えています。

[('123456', 'ABC', '20', '5600'), ('123456', 'BCD', '50', '7600'),('123456', 'DEF', '70', '5200')]

そのために、

python

1sv_data = [] 2for e in soup.find_all(['data-report' or 'data-info']): 3 if e.attrs == {'test-id':True, 'name':True,'number':True, 'effect':True}: 4 sv_data.append((e['test-id'], e['name'], e['number'], e['effect'])) 5print(sv_data)

と書いてみましたが、空のリストが作成されるのみです。

どのように変更したらうまく行きますでしょうか?

どうか宜しくお願い致します。

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

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

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

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

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

meg_

2021/12/22 11:13

・xmlの構造(階層)はどうなっていますか? ・「e.attrs == {'test-id':True, 'name':True,'number':True, 'effect':True}」は何を表現していますか?
guest

回答1

0

ベストアンサー

data-report レコードの終端 </data-report> が無いと適切に処理ができないので、以下では追加した XML データを使っています。また、BeautifulSoup の XML パーサに lxml を指定しています。

python

1from bs4 import BeautifulSoup 2from pprint import pprint 3 4xml_text = ''' 5<data-report test-id = 123456 factor = A> 6<data-info name = ABC number="20" effect="5600" cost="1000"> 7<data-info name = BCD number="50" effect="7600" cost="1500"> 8<data-info name = DEF number="70" effect="5200" cost="1800"> 9</data-report> 10<data-report test-id = 234567 factor= B> 11<data-info name = GHI number="90" effect="6500" cost="2000"> 12<data-info name = JKL number="110" effect="6700" cost="3000"> 13<data-info number="130" effect="2500" cost="4000"> 14</data-report> 15<data-report factor= C> 16<data-info name = GHI number="90" effect="6500" cost="2000"> 17<data-info name = JKL number="110" effect="6700" cost="3000"> 18<data-info name = DEF number="130" effect="2500" cost="4000"> 19</data-report> 20'''.strip() 21 22soup = BeautifulSoup(xml_text, 'lxml') 23 24sv_data = [] 25for r in soup.select('data-report[test-id]'): 26 for i in r.select('data-info[name][number][effect]'): 27 sv_data.append((r['test-id'], i['name'], i['number'], i['effect'])) 28 29pprint(sv_data) 30 31# 32[('123456', 'ABC', '20', '5600'), 33 ('123456', 'BCD', '50', '7600'), 34 ('123456', 'DEF', '70', '5200'), 35 ('234567', 'GHI', '90', '6500'), 36 ('234567', 'JKL', '110', '6700')]

投稿2021/12/22 17:12

melian

総合スコア19865

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

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

MonTesra

2021/12/22 22:34

xmlの表記に不備がありましてすみませんでした。 補足していただいた上で、教えて頂き誠にありがとうございます。 select系のメソッドの使用方法についても学ばせて頂きました。 質問に不備がないよう気をつけさせて頂きます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問