是否可以将变量传递给(Beautifulsoup)soup.find()?

时间:2014-01-25 15:02:38

标签: python beautifulsoup

您好我需要将变量传递给soup.find()函数,但它不起作用:( 有谁知道这方面的解决方案?

from bs4 import BeautifulSoup

html = '''<div> blabla
<p class='findme'> p-tag content</p>
</div>'''

sources = {'source1': '\'p\', class_=\'findme\'',
           'source2': '\'span\', class_=\'findme2\'',
           'source1': '\'div\', class_=\'findme3\'',}

test = BeautifulSoup(html)

# this works
#print(test.find('p', class_='findme'))
# >>> <p class="findme"> p-tag content</p>


# this doesn't work
tag = '\'p\' class_=\'findme\''

# a source gets passed
print(test.find(sources[source]))
# >>> None

我正试图将其拆分,如下所示:

pattern = '"p", {"class": "findme"}'
tag = pattern.split(', ')
tag1 = tag[0]
filter = tag[1]
date = test.find(tag1, filter)

我没有收到错误,只是没有错误。问题可能是tag1和过滤器的内容pycharm的debuger给了我:

tag1 = '"p"'
filter = '{"class": "findme"}'

打印它们并不显示这些萎缩。是否有可能删除这些萎缩症?

2 个答案:

答案 0 :(得分:2)

第一个参数是标记 name ,而您的字符串不包含该标记。 BeautifulSoup(或Python,通常)不会解析出这样的字符串,它无法猜测你在该值中放置了一些任意的Python语法。

分开组件:

tag = 'p'
filter = {'class_': 'findme'}
test.find(tag, **filter)

答案 1 :(得分:0)

好的,我明白了,再次感谢。

dic_date = {'source1': 'p, class:findme', other sources ...}

pattern = dic_date[source]
tag = pattern.split(', ')
if len(tag) is 2:
    att = tag[1].split(':')  # getting the attribute
    att = {att[0]: att[1]}  # building a dictionary for the attributes
    date = soup.find(tag[0], att)
else:
    date = soup.find(tag[0])  # if there is only a tag without an attribute

嗯它看起来不太好但是有效:)