如何使用Beautiful Soup 4查找属性

2024-09-29 21:47:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图像下面这样解析html:

<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标记(及其子标记)。对于上面的例子,这意味着我想要tr标记,其中data-row不是2或3。在

我怎么用靓汤4来做这个?在

我试过了

^{pr2}$

但是当我想要一个长度为4的bs4.element.ResultSet时,它返回了一个长度为8的类型bs4.element.ResultSet(即,它包含了带有td标记的tr子元素),而此时我需要一个长度为4的tr标记和{}标记。在


Tags: 标记rightdatahtmlelementtrclassover
2条回答

默认情况下,find_all将递归搜索。因此,td标记是有效的匹配项。在

Docs

If you call mytag.find_all(), Beautiful Soup will examine all the descendants of mytag: its children, its children’s children, and so on. If you only want Beautiful Soup to consider direct children, you can pass in 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)

输出:

^{pr2}$

当我指定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

{{cd2}也可以使用{cd2}:

^{pr2}$

相关问题 更多 >

    热门问题