如何在BeautifulSoup(Python)中嵌套find_all语句?

pexxcrt2  于 2022-10-30  发布在  Python
关注(0)|答案(3)|浏览(176)

我从使用Selenium拖动页面开始,我相信我使用以下代码正确地将页面中需要的部分传递给BeautifulSoup:

soup = BeautifulSoup(driver.find_element("xpath", '//*[@id="version_table"]/tbody').get_attribute('outerHTML'))

现在我可以使用BeautifulSoup进行解析

query = soup.find_all("tr", class_=lambda x: x != "hidden*")
print (query)

我的问题是,我需要深入挖掘,而不仅仅是这一个查询。例如,我想将这一个嵌套在第一个查询中(因此第一个查询必须为真,然后是这一个):

query2 = soup.find_all("tr", id = "version_new_*")
print (query2)

从逻辑上讲,这就是我要做的(但是我得到了SyntaxError:无效语法):

query = soup.find_all(("tr", class_=lambda x: x != "hidden*") and ("tr", id = "version_new_*"))
print (query)

我该如何完成这项工作?

ktecyv1j

ktecyv1j1#

关于:query = soup.find_all(...) and print (query)
find_all将返回一个可迭代类型。可迭代类型可以被迭代。

for query in soup.find_all(...): 
    print(query)
ltqd579y

ltqd579y2#

您可以对每个元素使用lambda函数(沿着regex)来进行一些高级条件处理

import re

query = soup.find_all(
    lambda tag: 
        tag.name == 'tr' and
        'id' in tag.attrs and re.search('^version_new_*', str(tag.attrs['id'])) and
        'class' in tag.attrs and not re.search('^hidden*', str(tag.attrs['class']))
)
print(list(query))

对于html中的每个元素,我们都在检查...
1.如果标记是表格行(tr)
1.如果标记有id并且该id与模式匹配
1.如果标记具有类并且该类与模式匹配

fdbelqdn

fdbelqdn3#

如前所述,没有任何例子,这是很难帮助或给予一个准确的答案-然而,你可以使用css selector

soup.select('tr[id^="version_new_"]:not(.hidden)')

示例

from bs4 import BeautifulSoup

html = '''
<tr id="version_new_1" class="hidden"></tr>
<tr id="version_new_2"></tr>
<tr id="version_new_3" class="hidden"></tr>
<tr id="version_new_4"></tr>
'''

soup = BeautifulSoup(html)

soup.select('tr[id^="version_new_"]:not(.hidden)')
输出

将是一个ResultSet,你可以迭代来刮你需要的东西。

[<tr id="version_new_2"></tr>, <tr id="version_new_4"></tr>]

相关问题