【问题标题】:Regular expressions in Beautiful soup don't workBeautiful soup 中的正则表达式不起作用
【发布时间】:2015-09-04 20:00:25
【问题描述】:
我正在寻找一个标签。这个标签的类包含这个子字符串:borderbox flightbox p2。
例如:<div class="borderbox flightbox p2 my-repeat-animation ng-scope"...
所以我想这应该可行:
soup.find_all('div',class_=re.compile(r"borderbox flightbox p2"+".*"))
但它找不到任何东西。你有什么建议吗?
【问题讨论】:
标签:
python
html
regex
beautifulsoup
【解决方案1】:
这应该做你想做的:
def match_tag(tag, classes):
return (tag.name == 'div'
and 'class' in tag.attrs
and all([c in tag['class'] for c in classes]))
divs = soup.find_all(lambda t: match_tag(t, ['borderbox', 'flightbox', 'p2'))
在 BeautifulSoup 4 中,传递给 class_ 参数的正则表达式分别应用于每个 CSS 类。 BeautifulSoup 正在检查您的 div 持有的每个单独的 CSS 类,以查看它是否与您提供的正则表达式匹配。将其放入代码中,它正在执行以下操作:
for class in div['class']:
if regexp.search(class): yield div
当然,您所拥有的任何个人课程都不会与您的正则表达式相匹配;在'borderbox'、'flightbox' 或'p2' 中找不到'borderbox flightbox p2'。
解决方法是利用 BeautifulSoup 的取函数能力为你做匹配。 match_tag 检查 (1) 标签是 div 和 (2) 标签具有由参数 classes 指定的每个 CSS 类。
【解决方案2】:
BeautifulSoup 相当于 re.search(),而不是 re.match()
试试
soup.find_all('div', class_=re.compile('borderbox flightbox p2 \d+'))