在BeautifulSoup中使用多个条件

10

我们使用这段代码来查找包含文本“Fiscal”的标签。

soup.find(class_="label",text=re.compile("Fiscal"))

我该如何在这里放置多个条件。

假设标签包含“财政”和“年份”两者。

或者标签包含“财政”但不包含“年份”。

2个回答

14

如果你发现标准可能会变得更加复杂,那么你可以使用函数作为筛选器,例如:

比如包含“Fiscal”和“year”两个标签。

t = soup.find(class_="label", text=lambda s: "Fiscal" in s and "year" in s)

或者包含“Fiscal”的标签,但不包含“year”。
t = soup.find(class_="label", text=lambda s: "Fiscal" in s and "year" not in s)

您也可以在此处使用正则表达式,但可能会更难理解。


0

你可以将文本作为列表传递(这个网站是我之前回答的例子 :))

import requests
from bs4 import BeautifulSoup

res = requests.get('http://www.snapdeal.com/products/computers-laptops?sort=plrty&')
soup = BeautifulSoup(res.text)

elements = soup.find_all('div', {'class': 'lfloat'}, text=re.compile(r'(14|4)')) # | means 'or'

print elements 

打印 [<div class="lfloat">(14)</div>, <div class="lfloat">(4)</div>, <div class="lfloat">(45)</div>]

所以你可以在你的情况下使用:soup.find_all(class_="label",text=re.compile(r'(Fiscal|yeah)))

要进行精确匹配,您可以将text作为列表传递:soup.find_all(class_="label",text=['Fiscal', 'yeah'])

“查找财政和不是yeah”的逻辑可以通过使用此代码来实现:soup.find_all('div', {'class': 'lfloat'}, text=re.compile(r'(Fiscal|[^yeah])'))(不确定)


这只匹配整个文本,而不是部分。 - Martijn Pieters
这只回答了问题的一部分,但是,是的,匹配作者所寻找的特定组合(或排除特定组合)的正则表达式就是答案。 - Martijn Pieters
然而,确保两个单词存在的正则表达式并不是那么简单。 - Martijn Pieters
你可以在这里将 {'class':'lfloat'} 替换为简单的 'lfloat' - jfs
该列表是用于查找文本中是否存在“Fiscal”和“year”两个词语中的任意一个,但OP要求同时包含这两个词。因此,“not year”的正则表达式是不正确的。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接