2016-11-02 17 views
1

私の要求する要素のパスを私のBeautifulSoupパーサが無視して、そのポイントまでのパスにかかわらずパスの最後の要素の名前を持つ最初のタグを返します。BeautifulSoupナビゲーションは指定されたパスを無視します

XML:

<root> 
    <firstcategory> 
     <subcategory> 
      <id>123</id> 
      <name>SubcategX</name> 
     </subcategory> 
     <id>789</id> 
     <name>Category1</name> 
    </firstCategory> 
</root> 
Python

コード:

from bs4 import BeautifulSoup 

testXML = "<root><firstcategory><subcategory><id>123</id><name>SubcategX</name></subcategory><id>789</id><name>Category1</name></firstCategory></root>" 

soup = BeautifulSoup(testXML) 
#below should be 789 
categID = soup.root.firstcategory.id 
#this prints 123, which corresponds to the path root.firstcategory.subcategory.id, not root.firstcategory.id 
print("categID = %s" % categID) 

なぜBeautifulSoupは単純にかかわらず、指定されたパスの階層内の第1のIDタグを検索しますか?

答えて

2

ドットシンタックスを使用すると、BeautifulSoupはすべての祖先を再帰的に検索しています。サブカテゴリ<id>が最初に見つかります。あなたが行うことができます再帰を防ぐため

、:ここで

soup.firstcategory.find('id', recursive=False) 

docs for the recursive argumentです。

0

リストにする必要があります。だからあなたはすべてのIDを取得するためのリストが必要です。その後、それを入手するために循環に使用することができます。

categIDs = soup.select('id') 
i = 0 
for categID in categIDs: 
    ID[i] = cateID.get_text() 
    i+=1 
print ID 
+0

これは、forループ内にインデックスを保持する悪い例です。 'for i、categID in enumerate(categIDs):'のために列挙する必要があります – Soviut

関連する問題