2016-09-23 101 views
1

HTML頁面的只有外層標籤的孩子:的Python - Beautifulsoup計數標籤

<form name="compareprd" action=""> 
    <div class="gridBox product " id="quickLookItem-1"> 
     <div class="gridItemTop"> 
     </div> 
    </div> 
    <div class="gridBox product " id="quickLookItem-2"> 
     <div class="gridItemTop"> 
     </div> 
    </div> 
    <!-- many more like this. --> 

我用美麗的湯報廢的頁面。在該頁面中,我可以通過名稱獲取表單標籤。

tag = soup.find("form", {"name": "compareprd"}) 

現在我想要計算所有即時子div,但不是所有嵌套的div。 說例如裏面有20個即時div。 我想:

len(tag.findChildren("div")) 

但它提供了1500

我認爲它給所有的「形式」標籤內的「分區」。

任何幫助表示讚賞。

+1

你認爲是正確的,通過['遞歸= FALSE'](https://www.crummy.com/software/BeautifulSoup/bs4/doc/#the-recursive-argument)到'findChildren'爲了只找到直接的孩子。你的HTML看起來像標籤湯,但不要關閉'div.gridBox'標籤。 –

+0

謝謝!.Ah對不起,我寫錯了代碼示例。更新了示例。 – Kishan

回答

1

您可以使用一個CSS選擇form[name=compareprd] > div將找到div的是形式的直接孩子:

html = """<form name="compareprd" action=""> 
<div class="gridBox product " id="quickLookItem-1"> 
    <div class="gridItemTop"> 
    </div> 
</div> 

<div class="gridBox product " id="quickLookItem-2"> 
    <div class="gridItemTop"> 
    </div> 
</div> 
</form>""" 

from bs4 import BeautifulSoup 

soup = BeautifulSoup(html) 


print(len(soup.select("form[name=compareprd] > div"))) 

或者作爲評論通遞歸=真但使用find_allfindChildren回到bs2天,只提供向後兼容性。

len(tag.find_all("div", recursive=False)