如何使用Beautiful Soup检查p标签中是否存在电子邮件?

时间:2019-05-21 18:28:17

标签: regex python-3.x beautifulsoup

我正在使用Beautiful Soup尝试检查div标签中的段落标签中是否有电子邮件地址。我要遍历div列表:

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 个答案:

答案 0 :(得分:1)

您可以使用

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节点中仅包含电子邮件的文本。