Как проверить, существует ли электронная почта в теге p с помощью Beautiful Soup? - PullRequest
1 голос
/ 21 мая 2019

Я использую Beautiful Soup, чтобы попытаться проверить, есть ли адрес электронной почты в теге абзаца внутри тега div. Я за цикл по списку divs:

for div in list_of_divs:

Где каждый div:

<div>
  <p>Hello</p>
  <p>hereIsAnEmail@gmail.com</p>
</div>

В цикле for у меня есть:

email = div.find(name="p", string=re.compile("^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$"))

name = "p" работает нормально, но я не уверен, что поставить для строки. Любая помощь или направление приветствуется.

1 Ответ

1 голос
/ 21 мая 2019

Вы можете использовать

html="""<div>
  <p>Hello</p>
  <p>hereIsAnEmail@gmail.com</p>
</div>"""
soup = BeautifulSoup(html, "html5lib")
list_of_divs = soup.find_all('div')
for div in list_of_divs:
    emails = div.find_all("p", string=re.compile(r"^[\w.-]+@(?:[\w-]+\.)+\w{2,4}$"))
    print([em.text for em in emails])

Выход: ['hereIsAnEmail@gmail.com']

Обратите внимание, что ^[\w.-]+@(?:[\w-]+\.)+\w{2,4}$ является довольно ограничительным, вы можете использовать более общий тип, например ^\S+@\S+\.\S+$, который соответствует 1+ непробельным символам, @, 1+ непробельным символам, . и снова 1+ непробельные символы.

Примечания к коду:

  • С div.find_all("p", string=re.compile(r"^[\w.-]+@(?:[\w-]+\.)+\w{2,4}$")) вы получите все дочерние теги p текущего элемента div, текст которого полностью соответствует шаблону регулярных выражений
  • print([em.text for em in emails]) печатает только тексты всех найденных p узлов, содержащих только электронные письма.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...