beautifulsoup:在 bs4.element.ResultSet 对象或列表上找到_all?

Posted

技术标签:

【中文标题】beautifulsoup:在 bs4.element.ResultSet 对象或列表上找到_all?【英文标题】:beautifulsoup: find_all on bs4.element.ResultSet object or list? 【发布时间】:2016-07-04 17:11:13 【问题描述】:

您好,我在 beautifulsoup object 上应用 find_all,然后找到一些东西,即 bs4.element.ResultSet objectlist

我想在其中进一步做 find_all,但在 bs4.element.ResultSet object 上是不允许的。我可以遍历bs4.element.ResultSet object 的每个元素来执行find_all。但是我可以避免循环并将其转换回beautifulsoup object吗?

详情请查看代码。谢谢

html_1 = """
<table>
    <thead>
        <tr class="myClass">
            <th>A</th>
            <th>B</th>
            <th>C</th>
            <th>D</th>
        </tr>
    </thead>
</table>
"""
soup = BeautifulSoup(html_1, 'html.parser')

type(soup) #bs4.BeautifulSoup

# do find_all on beautifulsoup object
th_all = soup.find_all('th')

# the result is of type bs4.element.ResultSet or similarly list
type(th_all) #bs4.element.ResultSet
type(th_all[0:1]) #list

# now I want to further do find_all
th_all.find_all(text='A') #not work

# can I avoid this need of loop?
for th in th_all:
    th.find_all(text='A') #works

【问题讨论】:

【参考方案1】:

ResultSet 类是列表的子类,而不是定义了find* 方法的Tag class。循环遍历find_all() 的结果是最常用的方法:

th_all = soup.find_all('th')
result = []
for th in th_all:
    result.extend(th.find_all(text='A'))

通常,CSS selectors 可能会帮助您一次性解决它,除非您可以使用 find_all() 完成的所有操作都无法通过 select() 方法实现。例如,bs4 CSS 选择器中没有可用的“文本”搜索。但是,例如,如果您必须在 th 元素中查找所有 b 元素,您可以这样做:

soup.select("th td")

【讨论】:

将soup.find_all 的结果复制到th_all 后,对th_all 的更改会反映在soup 中吗? 会的。取决于您使用的功能。参考:beautiful-soup-4.readthedocs.io/en/latest/#modifying-the-tree

以上是关于beautifulsoup:在 bs4.element.ResultSet 对象或列表上找到_all?的主要内容,如果未能解决你的问题,请参考以下文章

解析库之beautifulsoup,pyquery

爬虫模块介绍--Beautifulsoup

解析库之beautifulsoup模块

beautifulsoup模块

beautifulsoup模块

Beautifulsoup模块