2014-09-18 8 views
3

Мы используем этот код находят метки, содержащие текст «фискальный»Использование Множественные условия в BeautifulSoup

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

Как поместить несколько условий здесь.

Скажем, теги, содержащие «фискальные» и «год», оба.

Или теги, содержащие «фискальный», а не «год»

ответ

6

Если вы видите, что критерии меняются и они могли бы получить более сложными, то вы можете использовать функцию фильтр, например:

Скажем, теги, содержащие «фискальные» и «год», оба.

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

Или теги, содержащие "фискальный", а не "год"

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'])

«Найти фискальные и НЕ да» логик может быть покрыт с помощью этого: soup.find_all('div', {'class': 'lfloat'}, text=re.compile(r'(Fiscal|[^yeah])')) (не уверен, что здесь)

+0

Это соответствует только * всему тексту *, а не частично. –

+0

обновил ответ –

+0

Это только ответы на часть вопроса, но да, регулярное выражение, которое соответствует конкретным комбинациям, которые ищет OP (или исключает конкретные комбинации), является ответом. –

Смежные вопросы