从邮件正文中提取域名
我在想有没有办法用Python从电子邮件的内容中提取出域名。我考虑过使用正则表达式,但我对写正则表达式不是很在行,所以想问问有没有人能帮我。这里有一段电子邮件的内容:
<tr><td colspan="5"><font face="verdana" size="4" color="#999999"><b>Resource Links - </b></font><span class="snv"><a href="http://clk.about.com/?zi=4/RZ">Get Listed Here</a></span></td><td class="snv" valign="bottom" align="right"><a href="http://sprinks.about.com/faq/index.htm">What Is This?</a></td></tr><tr><td colspan="6" bgcolor="#999999"><img height="1" width="1"></td></tr><tr><td colspan="6"><map name="sgmap"><area href="http://x.about.com/sg/r/3412.htm?p=0&ref=fooddrinksl_sg" shape="rect" coords="0, 0, 600, 20"><area href="http://x.about.com/sg/r/3412.htm?p=1&ref=fooddrinksl_sg" shape="rect" coords="0, 55, 600, 75"><area href="http://x.about.com/sg/r/3412.htm?p=2&ref=fooddrinksl_sg" shape="rect" coords="0, 110, 600, 130"></map><img border="0" src="http://z.about.com/sg/sg.gif?cuni=3412" usemap="#sgmap" width="600" height="160"></td></tr><tr><td colspan="6"> </td></tr>
<tr><td colspan="6"><a name="d"><font face="verdana" size="4" color="#cc0000"><b>Top Picks - </b></font></a><a href="http://slclk.about.com/?zi=1/BAO" class="srvb">Fun Gift Ideas</a><span class="snv">
from your <a href="http://chinesefood.about.com">Chinese Cuisine</a> Guide</span></td></tr><tr><td colspan="6" bgcolor="cc0000"><img height="1" width="1"></td></tr><tr><td colspan="6" class="snv">
所以我需要像“clk.about.com”这样的域名。
谢谢!
5 个回答
1
HTMLParser 是一种干净的处理方式。如果你想要快速简单的方法,或者只是想看看一个中等复杂度的正则表达式长什么样,这里有一个用来查找 href 的正则表达式示例(这是我随便想的,没测试过):
r'<a\s+href="\w+://[^/"]+[^"]*">'
1
你可以使用Python标准库中的HTMLParser
来获取文档中的某些部分。
2
最简单的方法是使用来自 lxml.html
的 cssselect
和 urlparse
。下面是具体步骤:
from lxml import html
from urlparse import urlparse
doc = html.fromstring(html_data)
links = doc.cssselect("a")
domains = set([])
for link in links:
try: href=link.attrib['href']
except KeyError: continue
parsed=urlparse(href)
domains.add(parsed.netloc)
print domains
首先,你需要用 fromstring
把 HTML 数据加载到一个文档对象里。接着,使用标准的 CSS 选择器通过 cssselect
来查询文档中的链接。然后,你可以遍历这些链接,使用 .attrib['href']
来获取它们的 URL。如果某个链接没有 URL,就跳过它(用 except - continue
)。接下来,用 urlparse
将 URL 解析成一个命名元组,并把域名(netloc
)放到一个集合里。就这样完成了!
尽量避免使用正则表达式,因为网上有很多好用的库可以用。正则表达式维护起来比较麻烦,而且不适合用来解析 HTML。
更新:评论中提到的 href
过滤建议非常有用,代码会变成这样:
from lxml import html
from urlparse import urlparse
doc = html.fromstring(html_data)
links = doc.cssselect("a[href]")
domains = set([])
for link in links:
href=link.attrib['href']
parsed=urlparse(href)
domains.add(parsed.netloc)
print domains
你不需要 try-catch
语句块,因为 href
过滤器会确保你只捕获那些带有 href
属性的链接。