【问题标题】:How to find first <td> in table that contains a <p> element using BeautifulSoup?如何使用 BeautifulSoup 在包含 <p> 元素的表中找到第一个 <td>?
【发布时间】:2017-11-27 07:07:42
【问题描述】:

我正在尝试解析位于此页面http://www.bluenote.net/newyork/schedule/index.shtml 的表格。我正在尝试获取今天正在演奏的人的开始时间和乐队名称。我注意到表中包含 p 元素的第一个 td 是我正在寻找的。知道我会怎么做吗?我尝试使用

soup.findAll("p") 

但我试图选择包含该“p”元素的整个“td”。

【问题讨论】:

    标签: python html parsing web-scraping beautifulsoup


    【解决方案1】:

    您可以使用生成器:

    first_td = next(td for td in soup.find_all('td') if td.p)
    #               ^           generator                  ^
    

    find_all 将产生所有 &lt;td&gt; 标记。然后我们通过td.p 过滤标签。这将返回p 标签(假设有一个)。否则它将返回None。由于None真实性False,而标签对象是True,因此生成器将枚举所有带有&lt;p&gt; 标签的&lt;td&gt; 标签。

    我们调用next(..) 来获取这些元素中的第一个。如果不存在这样的元素,它将引发StopIteration 异常。

    如果你想要所有这些标签,你可以使用列表推导:

    [td for td in soup.find_all('td') if td.p]
    

    【讨论】:

    • 谢谢你这很好,除了它返回每个包含 p 标签的 标签,而不仅仅是第一个标签。有没有办法将每个 td 放入一个数组中?
    • @JackGruber:生成器会这样做。但是通过调用 next(..) 部分,您只能获得第一个匹配项。
    • 我想我误解了一些东西,对不起。我调用了下一个,但仍在返回所有标签,好像我没有调用下一个
    • @JackGruber:它应该返回第一个 &lt;td&gt; 标签。标记的表示将生成 outer html。因此,您可能会看到额外的 &lt;p&gt; 标记等。但您有对第一个 td 标记的引用。标签中的内容是我们不太关心的。
    • 啊啊是有道理的。知道如何让它将每个 td 元素返回到数组中吗?
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签