BeautifulSoupのfindAllではrecursiveが設定できる

ケータイのキャリアをNTTドコモからSoftBankに変えてしまったbonlifeです。

BeautifulSoupのfindAllではその子要素以下まで全て見つけてきてしまうようだ。

そこで、自分が誰の子要素かを判断するために「parent」を使う。

BeautifulSoupのfindAllについてのこんな記事がありました。アプローチとしては正しいと思いますが、別解もありますよね。

BeautifulSoupのrecursiveをFalseにする

In [3]: from BeautifulSoup import BeautifulStoneSoup

In [4]: xml = """<?xml ?>
   ...: <list>
   ...:   <item>test11</item>
   ...:   <sublist>
   ...:     <item>test21</item>
   ...:     <item>test22</item>
   ...:   </sublist>
   ...:   <item>test12</item>
   ...: </list>"""

In [5]: soup = BeautifulStoneSoup(xml)

In [6]: for e in soup.findAll('item'):
   ...:     print e
   ...:
   ...:
<item>test11</item>
<item>test21</item>
<item>test22</item>
<item>test12</item>

In [7]: for L in soup.findAll('list',recursive=False):
   ...:     for i in L.findAll('item',recursive=False):
   ...:         print i
   ...:
   ...:
<item>test11</item>
<item>test12</item>

こんな感じ。

補足

こういうのはXpathの方が向いてますぜ、ってことを説明するためにlxml使おうとしたらparseでエラー。

<class 'lxml.etree.XMLSyntaxError'>: Malformed declaration expecting version, line 1, column 6

XML宣言ではversionは省略できないんですね。ほえほえ。XML、なんとなくで使ってるので一通りちゃんと勉強したいところ。