我正在使用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”可以正常工作,但是我不确定要为字符串加上什么。任何帮助或指导表示赞赏。
答案 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
节点中仅包含电子邮件的文本。