Как передать параметр в строку re.compile() в BeautifulSoup?
Я изучаю Beautifulsoup, и я хотел бы использовать регулярное выражение для фильтрации строк.
Например, HTML-тег:
<div>apple<\div>
<div>android<\div>
<div>windows<\div>
Этот код будет работать:
re_words = re.compile(u".*(apple|android).*")
for content in body.findAll("div"):
if re_words.match(content.text):
print content.text
Но я хотел бы динамически добавлять ключевые слова в регулярные выражения, поэтому я пытаюсь написать этот код:
word0 = "apple"
word1 = "android"
regular = "u""\".*("
regular += word0
regular += "|"
regular += word1
regular +=").*\""
re_words = re.compile(regular)
for content in body.findAll("div"):
if re_words.match(content.text):
print content.text
на этот раз мне не удалось создать легальный re.compile(). Так кто-нибудь поможет?
1 ответ
Прежде всего, вы можете передать скомпилированное регулярное выражение text
аргумент find_all()
вызов. Чтобы динамически создавать регулярные выражения, я бы поместил заполнитель в круглые скобки и соединил ключевые слова с |
:
keywords = ["apple", "android"]
pattern = r"(%s)" % "|".join(keywords)
for content in body.find_all("div", text=re.compile(pattern)):
print(content.text)
Кроме того, вы можете передать вызываемый как text
значение аргумента:
keywords = ["apple", "android"]
for content in body.find_all("div",
text=lambda text: any(keyword in text
for keyword in keywords)):
print(content.text)
Также обратите внимание, что если вам нужно точное совпадение текста, вам не понадобятся регулярные выражения:
keywords = ["apple", "android"]
for content in body.find_all("div", text=keywords):
print(content.text)