通过参数的findAll Python中BS4(pass argument to findAll i

2019-10-29 06:04发布

我需要在函数中调用BS4帮助。 如果我想通过函数传递路径的findAll(或发现),这是行不通的。 请参阅下面的示例。

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!

没有人有一个解决方案吗? 谢谢

Answer 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!')

而不是传递作为字符串,传递一个词典,其元素可以作为关键字参数被传递给调用的函数。



Answer 2:

findAll方法将一个标签名称作为第一个参数,而不是一个路径。 它返回所有的名字相匹配的一个传递的标签,是在调用它的标签的后裔。 这是使用它的目的是必经之路,也就是说,它并不意味着接收路径。 检查的文档获取更多信息。

现在, soup.findAll(path)将寻找其名称是标签path 。 由于path = '"h1", {"class": "headline"}' soup.findAll(path)将寻找<'"h1", {"class": "headline"}'>中的HTML标记字符串,其中最有可能不存在。

所以基本上,有没有这样的事,作为一个“路径”。 但是,你正在使用的语法让我觉得,你想它的标签class属性等于"headline" 。 指定属性的方式findAll方法将它们作为一个字典到attrs说法。 你大概的意思做的是:

soup.findAll('h1', attrs={'class': "headline"}, text="wilkommen")


文章来源: pass argument to findAll in bs4 in python