【问题标题】:Beautifulsoup - nextSiblingBeautifulsoup - nextSibling
【发布时间】:2011-08-25 09:05:18
【问题描述】:

我正在尝试使用以下内容获取内容“我的家庭住址”,但得到了 AttributeError:

address = soup.find(text="Address:")
print address.nextSibling

这是我的 HTML:

<td><b>Address:</b></td>
<td>My home address</td>

向下导航td标签并拉取内容的好方法是什么?

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    问题是您找到了NavigableString,而不是&lt;td&gt;nextSibling 也会找到下一个 NavigableString Tag 所以即使你有 &lt;td&gt; 它也不会像你期望的那样工作。

    这就是你想要的:

    address = soup.find(text="Address:")
    b_tag = address.parent
    td_tag = b_tag.parent
    next_td_tag = td_tag.findNext('td')
    print next_td_tag.contents[0]
    

    或者更简洁:

    print soup.find(text="Address:").parent.parent.findNext('td').contents[0]
    

    其实你可以这样做

    print soup.find(text="Address:").findNext('td').contents[0]
    

    由于findNext 只是一遍又一遍地调用next,而next 会重复按解析找到下一个元素,直到匹配为止。

    【讨论】:

      【解决方案2】:

      假设它在表中,您可以很容易地使用findChildren 迭代表中的 td。理想情况下,您可以先找到该表:

      table = soup.find('table')
      >>> for td in table.findChildren('td'):
      ...:     print td.text
      ...:     
      ...:     
      Address:
      My home address
      

      或者你可以搜索地址,得到表格容器:

      >>> import re
      >>> search = re.compile('Address')
      >>> table = soup.find(text=search).parent.parent.parent
      

      【讨论】:

      • 有很多表,所以查找表然后 td 看起来不是一个好选择。
      【解决方案3】:

      如果你使用 bs4 试试这个:

      print soup.find(string="Address:").find_next('td').contents[0]
      

      【讨论】:

        【解决方案4】:

        我不知道这在 2011 年是否可行,但在 2021 年,我建议您使用 find_next_sibling() 这样做:

        address = soup.find(text="Address:")
        b = address.parent
        address_td = b.parent
        target_td = address_td.find_next_sibling('td')
        

        接受的答案适用于您的情况,但如果您有类似的情况,它将不起作用:

        <div>
          <div><b>Address:</b><div>THE PROBLEM</div></div>
          <div>target</div>
        </div>
        

        你最终会得到&lt;div&gt;THE PROBLEM&lt;/div&gt; 而不是&lt;div&gt;target&lt;/div&gt;

        【讨论】:

          猜你喜欢
          • 2021-04-13
          • 2012-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-13
          • 2018-10-21
          • 2013-01-02
          • 2011-10-27
          相关资源
          最近更新 更多