Вы можете использовать
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
узлов, содержащих только электронные письма.