【问题标题】:How to get a nested element in beautiful soup如何在美丽的汤中获得嵌套元素
【发布时间】:2010-11-06 17:07:43
【问题描述】:

我正在为获取 td 中的一些 href 所需的语法而苦苦挣扎。 table、tr 和 td 元素没有任何类或 id。

如果我想在这个例子中抓住锚点,我需要什么?

...

谢谢

【问题讨论】:

    标签: python beautifulsoup


    【解决方案1】:

    这样的?

    from BeautifulSoup import BeautifulSoup
    soup = BeautifulSoup(html)
    anchors = [td.find('a') for td in soup.findAll('td')]
    

    这应该在您提供的 html 中的每个“td”中找到第一个“a”。您可以调整 td.find 使其更具体,或者如果每个 td 中有多个链接,则使用 findAll

    更新:关于 D​​aniele 的评论,如果您想确保列表中没有任何 None,那么您可以修改列表理解:

    from BeautifulSoup import BeautifulSoup
    soup = BeautifulSoup(html)
    anchors = [a for a in (td.find('a') for td in soup.findAll('td')) if a]
    

    这基本上只是添加一个检查以查看您是否有 td.find('a') 返回的实际元素。

    【讨论】:

    • 这很聪明!但是如果“a”不存在,它会在锚列表中包含一个 None 吗?我怎样才能只填充实际的'a's skypping the Nones的锚列表?
    • 好的,我已经更新了处理从列表中删除 None 的问题。
    【解决方案2】:

    根据文档,您首先制作一个解析树:

    import BeautifulSoup
    html = "<html><body><tr><td><a href='foo'/></td></tr></body></html>"
    soup = BeautifulSoup.BeautifulSoup(html)
    

    然后你在其中搜索,例如&lt;a&gt;标签,其直接父级是&lt;td&gt;

    for ana in soup.findAll('a'):
      if ana.parent.name == 'td':
        print ana["href"]
    

    【讨论】:

    • @Greyshack,对我来说很好用(当然使用当前版本,在原始帖子之后 6 年多——pip install beautifulsoup4,然后当然模块名称现在是 bs4)——打印'foo',根据需要。当然,不可能根据对您的问题的模糊描述为您提供任何帮助,例如“不 [原文如此] 工作”!-)
    猜你喜欢
    • 2015-07-16
    • 1970-01-01
    • 2011-11-15
    • 1970-01-01
    • 2021-03-24
    • 2021-05-03
    • 1970-01-01
    • 2020-12-09
    • 2019-04-21
    相关资源
    最近更新 更多