2016-04-23 52 views
1

我试图解析HTML类似如下:如何使用美丽的汤4找到属性

<tbody> 
    <tr class data-row="0"> 
     <td align="right"></td> 
    </tr> 
    <tr class data-row="1"> 
     <td align="right"></td> 
    </tr> 
    <tr class="thead over_theader" data-row="2"> 
     <td align="right"></td> 
    </tr> 
    <tr class="thead" data-row="3"> 
     <td align="right"></td> 
    </tr> 
    <tr class data-row="4"> 
     <td align="right"></td> 
    </tr> 
    <tr class data-row="5"> 
     <td align="right"></td> 
    </tr> 
</tbody> 

我想获得的所有tr标签(和他们的孩子)在未指定class的。对于上面的示例,这意味着我需要tr标签,其中data-row不是2或3.

如何使用美丽汤4做到这一点?

我试图

tableBody = soup.findAll('tbody') 
rows = tableBody[0].findAll(attrs={"class":""}) 

但这返回长度为8的类型bs4.element.ResultSet(即它包括tr孩子td标记)时,我想长度为4的bs4.element.ResultSet(每个tr标签与class = "") 。

回答

0

你的方法实际上对我的作品时,我指定tr标签名称:

>>> from bs4 import BeautifulSoup 
>>> data = """ 
... <tbody> 
...  <tr class data-row="0"> 
...   <td align="right"></td> 
...  </tr> 
...  <tr class data-row="1"> 
...   <td align="right"></td> 
...  </tr> 
...  <tr class="thead over_theader" data-row="2"> 
...   <td align="right"></td> 
...  </tr> 
...  <tr class="thead" data-row="3"> 
...   <td align="right"></td> 
...  </tr> 
...  <tr class data-row="4"> 
...   <td align="right"></td> 
...  </tr> 
...  <tr class data-row="5"> 
...   <td align="right"></td> 
...  </tr> 
... </tbody> 
... """ 
>>> soup = BeautifulSoup(data, "html.parser") 
>>> len(soup.find_all("tr", class_="")) 
4 

或者,你可以使用一个tr[class=""]CSS selector

>>> len(soup.select('tr[class=""]')) 
4 
0

find_all将默认,递归搜索。所以td标签是有效的匹配。

Docs

如果你打电话mytag.find_all(),美丽的汤将审查mytag所有后代:其子,其孩子的孩子,等等。如果你只是想美丽的汤考虑直接孩子,你可以通过在recursive=False

所以,你可能会写,例如:

tableBody = soup.findAll('tbody') 
rows = tableBody[0].find_all(attrs={"class":""}, recursive=False) 

print(len(rows)) 
for r in rows: 
    print('---') 
    print(r) 

输出:

4 
--- 
<tr class="" data-row="0"> 
<td align="right"></td> 
</tr> 
--- 
<tr class="" data-row="1"> 
<td align="right"></td> 
</tr> 
--- 
<tr class="" data-row="4"> 
<td align="right"></td> 
</tr> 
--- 
<tr class="" data-row="5"> 
<td align="right"></td> 
</tr>