<Python, Beautiful Soup> FindAllの後の処理

Beautiful Soupの使い方を少しメモ。

こういうhtmlがあった時、

In [34]: xml = '''
    ...: <d>
    ...: <name>Hage</name>
    ...: <qty>10</qty>
    ...: </d>
    ...: <d>
    ...: <name>Hige</name>
    ...: <qty>20</qty>
    ...: </d>
    ...: <d>
    ...: <name>Hoge</name>
    ...: <qty>12</qty>
    ...: </d>
    ...: <d>
    ...: <name>Haga</name>
    ...: <qty>15</qty>
    ...: </d>
    ...: '''

スープして、、

In [35]: from bs4 import  BeautifulSoup

In [36]: soup = BeautifulSoup(xml, 'lxml')

In [37]: type(soup)
Out[37]: bs4.BeautifulSoup

In [38]: soup
Out[38]: 
<html><body><d>
<name>Hage</name>
<qty>10</qty>
</d>
<d>
<name>Hige</name>
<qty>20</qty>
</d>
<d>
<name>Hoge</name>
<qty>12</qty>
</d>
<d>
<name>Haga</name>
<qty>15</qty>
</d>
</body></html>

dを検索して、

In [39]: d = soup.findAll('d')

In [40]: type(d)
Out[40]: bs4.element.ResultSet

In [41]: d
Out[41]: 
[<d>
 <name>Hage</name>
 <qty>10</qty>
 </d>, <d>
 <name>Hige</name>
 <qty>20</qty>
 </d>, <d>
 <name>Hoge</name>
 <qty>12</qty>
 </d>, <d>
 <name>Haga</name>
 <qty>15</qty>
 </d>]

検索結果bs4.element.ResultSetはどうもリストっぽい。
なら、リスト形式のアクセスは、

In [42]: d[0]
Out[42]: 
<d>
<name>Hage</name>
<qty>10</qty>
</d>

In [43]: d[1]
Out[43]: 
<d>
<name>Hige</name>
<qty>20</qty>
</d>

In [44]: len(d)
Out[44]: 4

できるらしい。
そういうことなら、下記ループ。

In [47]: for v in d:
    ...:     print(v.find('name').string)
    ...:     print(v.find('qty').string)
    ...:     
Hage
10
Hige
20
Hoge
12
Haga
15

なるほどね~。

マニュアル。

Beautiful Soup Documentation — Beautiful Soup 4.4.0 documentation