从网页中提取电子邮件地址是使用如Beautiful Soup这样的Web抓取库的一个重要应用。在任何网页中,电子邮件ID通常出现在锚点<a>
标签的href
属性中。电子邮件ID是使用mailto URL方案编写的。很多时候,电子邮件地址可能作为普通文本出现在页面内容中(没有超链接)。在本章中,我们将使用简单的技术,利用Beautiful Soup库从HTML页面中抓取电子邮件ID。
电子邮件ID在href
属性中的典型用法如下:
<a href="mailto:xyz@abc.com">test link</a>
在第一个示例中,我们将考虑以下HTML文档,用于从超链接中提取电子邮件ID:
<html>
<head>
<title>BeautifulSoup - Scraping Email IDs</title>
</head>
<body>
<h2>Contact Us</h2>
<ul>
<li><a href="mailto:sales@company.com">Sales Enquiries</a></li>
<li><a href="mailto:careers@company.com">Careers</a></li>
<li><a href="mailto:partner@company.com">Partner with us</a></li>
</ul>
</body>
</html>
以下是寻找电子邮件ID的Python代码。我们在文档中收集所有的<a>
标签,并检查标签是否有href
属性。如果是真的,其值的第6个字符之后的部分就是电子邮件ID。
from bs4 import BeautifulSoup
import re
fp = open("contact.html")
soup = BeautifulSoup(fp, "html.parser")
tags = soup.find_all("a")
for tag in tags:
if tag.has_attr("href") and tag['href'][:7] == 'mailto:':
print(tag['href'][7:])
对于给定的HTML文档,电子邮件ID将被提取如下:
sales@company.com
careers@company.com
partner@company.com
在第二个示例中,我们假设电子邮件ID出现在文本中的任何地方。为了提取它们,我们使用正则表达式的搜索机制。正则表达式是一种复杂的字符模式。Python的re
模块帮助处理正则表达式模式。以下正则表达式模式用于搜索电子邮件地址:
pat = r'[\w.+-]+@[\w-]+\.[\w.-]+'
对于此练习,我们将使用以下HTML文档,其中电子邮件ID在<li>
标签中。
<html>
<head>
<title>BeautifulSoup - Scraping Email IDs</title>
</head>
<body>
<h2>Contact Us</h2>
<ul>
<li>Sales Enquiries: sales@company.com</a></li>
<li>Careers: careers@company.com</a></li>
<li>Partner with us: partner@company.com</a></li>
</ul>
</body>
</html>
使用电子邮件正则表达式,我们将在每个<li>
标签字符串中找到模式的出现。以下是Python代码:
from bs4 import BeautifulSoup
import re
def isemail(s):
pat = r'[\w.+-]+@[\w-]+\.[\w.-]+'
grp = re.findall(pat, s)
return grp
fp = open("contact.html")
soup = BeautifulSoup(fp, "html.parser")
tags = soup.find_all('li')
for tag in tags:
emails = isemail(tag.string)
if emails:
print(emails)
输出
['sales@company.com']
['careers@company.com']
['partner@company.com']
使用上面描述的简单技术,我们可以使用Beautiful Soup从网页中提取电子邮件ID。