【问题标题】:How to use Beautiful Soup 4 to find attribute如何使用美汤4查找属性
【发布时间】:2016-08-16 18:00:43
【问题描述】:

我正在尝试解析 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>

我想获取未指定class 的所有tr 标签(及其子标签)。对于上面的示例,这意味着我想要 tr 标签,其中 data-row 不是 2 或 3。

如何使用 Beautiful Soup 4 做到这一点?

我试过了

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

但是当我想要一个长度为 4 的 bs4.element.ResultSet(每个 tr 一个带有 @987654332 @)。

【问题讨论】:

    标签: python html parsing attributes beautifulsoup


    【解决方案1】:

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

    Docs:

    如果您调用mytag.find_all(),Beautiful Soup 将检查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>
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-07-06
        • 1970-01-01
        • 1970-01-01
        • 2020-12-31
        • 2020-06-25
        • 2020-02-29
        • 2023-03-12
        • 1970-01-01
        • 2020-11-23
        相关资源
        最近更新 更多