从邮件正文中提取域名

1 投票
5 回答
887 浏览
提问于 2025-04-16 12:57

我在想有没有办法用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&amp;ref=fooddrinksl_sg" shape="rect" coords="0, 0, 600, 20"><area href="http://x.about.com/sg/r/3412.htm?p=1&amp;ref=fooddrinksl_sg" shape="rect" coords="0, 55, 600, 75"><area href="http://x.about.com/sg/r/3412.htm?p=2&amp;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">&nbsp;</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.htmlcssselecturlparse。下面是具体步骤:

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 属性的链接。

撰写回答