gpt4 book ai didi

python - 如何将一组参数作为一个长变量传递给 find()/find_all()

转载 作者:行者123 更新时间:2023-12-01 07:52:46 25 4
gpt4 key购买 nike

假设我有这个 html 代码:

html = """
<div non_class="first"></div>
<h2 style="some_style"> Text 1</h2>
<div non_class="second"></div>
<div non_class="first">Text 2</div>
"""

使用此代码:

from bs4 import BeautifulSoup as bs
soup = bs(html,'lxml')

我转至soup.find_all()两个参数,一个标签和一个属性/属性值对:

first = soup.find_all('div',non_class='first')
for i in first:
print(i)

将输出:

<div non_class="first"></div>
<div non_class="first">Text 2</div>

足够简单。现在假设我不想硬连接参数,而是想将它们传递给 find_all()作为变量。基于问题such as this , this , or this ,我使用了这种方法:

my_tag = 'div'
my_att = {'non_class': 'first'}

second = soup.find_all(my_tag,my_att)
for i in second:
print(i)

它会产生正确的输出。但这还远远不能令人满意。我的“目标”标签是 <div non_class="first">并且(如果一切顺利)它将成为我打算在 for 中使用的目标列表中的一个条目。环形。但是这些答案中提出的方法要求(除非有人有更好的方法!)我将目标分解为其组件:首先是一个标签(在本例中 - div ),然后采用属性/属性值对(在此示例中 non_class="first" )并将其转换为字典( {'non_class': 'first'} )并将这两个输入到 find_all(_) 中。这是可行的,但不优雅。

所以我尝试使用一个变量传递整组参数,但是

target = '<div non_class="first">'

third = soup.find_all(target)

什么也没找到。使用 f 字符串来喂养目标:

fourth = soup.find_all(f'{target}')

也失败了。

编辑:澄清一下,练习的目的是将元素提供给 find_all() 无需首先手动或使用辅助函数将其分解为其组成部分。从概念上讲,我想我不明白为什么 find_all()可以直接将元素作为字符串参数,但如果将字符串分配给变量,find_all()无法获取该变量并将其重新构成字符串参数...

那么这是可行的,还是我必须屈服于对目标进行切片和切 block ?或者,可以用 Selenium 来完成吗?

最佳答案

提取数据的方法有很多。如果我正确理解用例,下面的选项可能会对您有所帮助。

html = """
<div non_class="first"></div>
<h2 style="some_style"> Text 1</h2>
<div non_class="second"></div>
<div non_class="first">Text 2</div>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')


print(soup.find_all(non_class="first"))

find_element = lambda target,soup : soup.find_all(target['tag'],{target['attribute']:target['value']})
target = {'tag':'div','attribute':'non_class','value':'first'}
print(find_element(target,soup))

target = {'non_class': 'first'}
print(soup.find_all(attrs=target))

print(soup.find_all(non_class="first"))

甚至您可以实现如下所示的方法,将 html 标记作为字符串并返回目标值。

def get_element(selector_string,soup):
element = BeautifulSoup(selector_string,'lxml').body.next
return soup.find_all(element.name,element.attrs)

print(get_element('<div non_class="first">',soup))

关于python - 如何将一组参数作为一个长变量传递给 find()/find_all(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56115975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com