我将多个类值传递给l4 center
。该值类似于l5 center
OR "l4 center" | "l5 center"
。 (即soup.find_all("ul", {"class" : value)
)。
soup.find_all("ul", {"class" : re.compile("l[4-5]\scenter")})
#OR
soup.find_all("ul", {"class" : ["l4 center", "l5 center"]})
我使用以下两个解决方案失败(无输出):
#!/usr/bin/env python3
from bs4 import BeautifulSoup
import bs4
import requests
import requests.exceptions
import re
### function, , .... ###
def crawler_chinese_idiom():
url = 'http://chengyu.911cha.com/zishu_8.html'
response = requests.get(url)
soup = BeautifulSoup(response.text)
#for result_set in soup.find_all("ul", class=re.compile("l[45] +center")): #l4 center or l5 center
for result_set in soup.find_all("ul", {"class", re.compile(r"l[45]\s+center")}): #nothing output
#for result_set in soup.find_all("ul", {"class" : "l4 center"}): #normal one
print(result_set)
crawler_chinese_idiom()
#[] output nothing
源代码如下:
{{1}}
答案 0 :(得分:1)
更新:已解决https://bugs.launchpad.net/bugs/1476868
起初我认为问题是HTML中的class='l4 center'
实际上是两个类 - 认为汤不匹配,因为它正在寻找一个包含空格的类(不可能)。
尝试:
from bs4 import BeautifulSoup
import re
soup = BeautifulSoup("<html><div class='l5 center'>l5test</div><div class='l4 center'>l4test</div><div class='l6 center'>l6test</div>")
results1 = soup.findAll('div', re.compile(r'l4 center'));
print results1
results2 = soup.findAll('div', 'l4 center');
print results2
输出:
[]
[<div class="l4 center">l4test</div>]
但等等?非正则表达式选项工作正常 - 它找到了两个类。
此时,它看起来像是一个BeautifulSoup错误。
要解决它,你可以这样做:
soup.findAll('div', ['l4 center', 'l5 center']);
# update: ^ that doesn't work either.
# or
soup.findAll('div', ['l4', 'l5', 'center']);
我建议您使用第二个,以防您想要匹配l4 otherclass center
,但您可能需要迭代结果以确保您没有任何不需要的捕获。类似的东西:
for result in soup.findAll(...):
if (result.find({'class': 'l4'}) and result.find({'class': 'center'}):
# yay!
我已提交错误here进行调查。