我需要帮助在函数中使用bs4。如果我想通过函数传递findAll(或find)的路径,它就不起作用。请参阅下面的示例。
from bs4 import BeautifulSoup
data = '<h1 class="headline">Willkommen!</h1>'
def check_text(path, value):
soup = BeautifulSoup(''.join(data), "lxml")
x1 = "h1", {"class":"headline"}
x2 = path
x3 = tuple(path)
print type(x1), 'soup.findAll(x1)===', soup.findAll(x1)
print type(x2), 'soup.findAll(x2)===', soup.findAll(x2)
print type(x3), 'soup.findAll(x3)===', soup.findAll(x3)
for i in soup.findAll(x1):
print 'x1, text=', i.getText()
for i in soup.findAll(x2):
print 'x2, text=', i.getText()
for i in soup.findAll(x3):
print 'x3, text=', i.getText()
check_text('"h1", {"class": "headline"}', 'Willkommen!')
输出
<type 'tuple'> soup.findAll(x1)=== [<h1 class="headline">Willkommen! </h1>]
<type 'str'> soup.findAll(x2)=== []
<type 'tuple'> soup.findAll(x3)=== []
x1, text= Willkommen!
有没有人有解决方案? 感谢
答案 0 :(得分:1)
from bs4 import BeautifulSoup
data = '<h1 class="headline">Willkommen!</h1>'
def check_text(path, value):
soup = BeautifulSoup(''.join(data), "lxml")
x1 = "h1", {"class":"headline"}
print (type(x1), 'soup.findAll(x1)===', soup.findAll(x1))
print (type(path), 'soup.findAll(path)===', soup.findAll(**path))
for i in soup.findAll(x1):
print ('x1, text=', i.getText())
for i in soup.findAll(**path):
print ('path, text=', i.getText())
check_text({'name' : "h1", 'attrs': {"class": "headline"} }, 'Willkommen!')
而不是作为字符串传递,传递一个字典,其元素可以作为关键字参数传递给被调用函数。
答案 1 :(得分:0)
findAll
方法将标记名称作为第一个参数,而不是路径。
它返回名称与传递的名称匹配的所有标记,它们是调用它的标记的后代。
这是它打算使用的唯一方式,即它并不意味着接收路径。
查看the documentation了解详情。
现在,soup.findAll(path)
将查找名称为path
的标记。
由于path = '"h1", {"class": "headline"}'
,soup.findAll(path)
会在HTML字符串中查找<'"h1", {"class": "headline"}'>
标记,这些标记很可能不存在。
所以基本上,没有&#34;路径&#34;。
尽管如此,您使用的语法仍然让我认为您需要class
属性等于"headline"
的标记。
为findAll
方法指定属性的方法是将它们作为字典传递给attrs
参数。
你可能想做的是:
soup.findAll('h1', attrs={'class': "headline"}, text="wilkommen")