在python

时间:2017-07-11 07:52:36

标签: python function beautifulsoup

我需要帮助在函数中使用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!

有没有人有解决方案? 感谢

2 个答案:

答案 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")