的Python - Beautifulsoup计数标签

问题描述:

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

您可以使用一个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)