您好我需要将变量传递给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"}'
打印它们并不显示这些萎缩。是否有可能删除这些萎缩症?
答案 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
嗯它看起来不太好但是有效:)