teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

回答修正

2017/07/28 08:42

投稿

8524ba23
8524ba23

スコア38352

answer CHANGED
@@ -1,5 +1,33 @@
1
1
  以下のような最低限の`xml`データで再現しました。
2
2
  `soup.find("body")`すると`<body>xmlデータ全体</body>`が返ります。
3
+
4
+ #### 回答修正
5
+ パーサ`lxml`と指定すると、`HTML`パーサとして動作し、誤解釈してしまっているようです。
6
+ `lxml-xml`と`XML`パーサとして指定することで、正常に動作することが確認できました。
7
+ 各パーサについては[Installing a parser](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser)に記載されています。
8
+
9
+ ```Python
10
+ xml = """
11
+ <?xml version="1.0" encoding="UTF-8"?>
12
+ <results>
13
+ <usedcar>
14
+ <brand>
15
+ <code>TO</code><name>トヨタ</name>
16
+ </brand>
17
+ <body>
18
+ <code>M</code><name>ミニバン</name>
19
+ </body>
20
+ </usedcar>
21
+ </results>
22
+ """
23
+ from bs4 import BeautifulSoup
24
+ soup = BeautifulSoup(xml,'lxml-xml')
25
+ print(soup.find("body")) # 正常 <body><code>M</code><name>ミニバン</name></body>
26
+ print(soup.find("body").find("name")) # 正常 <name>ミニバン</name>
27
+ ```
28
+
29
+ #### 以前の回答
30
+
3
31
  ちょっと`xml`パーサの動作が不可解です。
4
32
 
5
33
  とりあえず`xml`データ(=文字列)中の`<body>`を`<body2>`に`replace`すると正しく取得できました。