Как передать параметр в строку 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)
Другие вопросы по тегам