【问题标题】:How to get all elements text in sequential order如何按顺序获取所有元素文本
【发布时间】:2016-01-22 03:51:11
【问题描述】:

我正在使用 bs4 从表格中获取文本

soup = BeautifulSoup(html_text)
table = soup.find("table", attrs={"class":"table_class"})

headings = [i.get_text() for i in table.find("tr").find_all("td")]

但是我怎样才能有 2 个 findall 顺序呢?我在下面尝试过

headings = [i.get_text() for i in table.find("tr").find_all("td").find_all("div")]

如果我只使用find("td"),我只会得到一个值,而不是表中的所有值。 如何循环遍历"td" 并为每个元素获取"div"

【问题讨论】:

    标签: javascript python html beautifulsoup bs4


    【解决方案1】:

    还有一种更简单更简洁的方式——CSS selector

    [elm.get_text() for elm in soup.select("table.table_class tr td div")]
    

    【讨论】:

    • 我可以遍历多个可迭代对象吗? "tr""thead" 之下,所以我可以做类似soup.select("table.table_class thead tr td div")] 的事情。我试过了,但它只打印一行
    • @user2661518 table.table_class tr td div - 这将遍历表中的每个tr,包括thead 中的tr 行。 table.table_class thead tr td div 为您提供单行,因为表头中有单行..
    • @alexce 是的,我有 3 行,每行以 "thead" 开头,但上面只给了我一行。我可以得到所有 3 行吗?抱歉,我是 CSS 新手
    • @user2661518 能否请您分享该页面的网址,或者可能是 HTML 的相关部分,以便我进行试验?谢谢!
    • 对不起,我刚刚意识到 div 只在第一行下面,这就是它没有提供任何输出的原因
    【解决方案2】:

    每当您遇到涉及迭代器/迭代器的问题时,请查看 itertools。

    from itertools import chain
    
    headings = [i.get_text() for i in chain.from_iterable(x.find_all("div") for x in table.find("tr").find_all("td"))]
    

    【讨论】:

    • @user2661518 没有实际测试数据真的很难测试。我以为有这张表,在它的第一个tr 中有几个tds,每个都包含divs,对吧?
    • 它工作得很好,但你可以遍历多个可迭代对象吗? "tr""thead" 下,所以我可以在find_all("thead") 下做类似find_all("tr") 的事情
    • @user2661518 你的意思是普通的chain?
    • 所以trthead 下面我有3 个thead 行,但上面只得到第一个thead 的输出,如何获得所有3 个?
    • 对不起,我刚刚意识到 div 只在第一行下面,这就是它没有提供任何输出的原因
    猜你喜欢
    • 2015-10-09
    • 2012-03-06
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-29
    相关资源
    最近更新 更多