2011-03-03 76 views
1

我想知道是否有任何方法可以從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」 等

謝謝!

+3

正則表達式非常強大,值得學習使用。我不使用Python,但從語言到語言,正則表達式非常相似。查看http://gskinner.com/RegExr/,並在學習語法之後自行構建正則表達式,而不是困難。 – ubiquibacon 2011-03-03 20:12:08

+1

我的上帝不要使用REGEX來描述HTML – jathanism 2011-03-03 22:49:54

回答

2

最乾淨的方法是使用cssselectlxml.htmlurlparse。這裏是如何:

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 

首先,你的HTML數據加載到一個文檔對象與fromstring。您使用標準css選擇器查​​詢文檔中的鏈接,鏈接爲cssselect。你穿過鏈接,用.attrib['href']抓住他們的網址 - 如果他們沒有任何(except - continue),就跳過它們。使用urlparse解析url到名爲元組中,並將該域(netloc)放入一個集合中。瞧!

嘗試避免正常表達式,當你有良好的圖書館在線。他們很難維護。也是一個不適用於HTML解析。

UPDATE: 在評論中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 

因爲href過濾器確保你抓住你不需要try-catch塊只有具有href屬性的錨。

1
from lxml import etree 
from StringIO import StringIO 
from urlparse import urlparse 
html = """<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">""" 
parser = etree.HTMLParser() 
tree = etree.parse(StringIO(html), parser) 
r = tree.xpath("//a") 
links = [] 
for i in r: 
    try: 
     links.append(i.attrib['href']) 
    except KeyError: 
     pass 

for link in links: 
    print urlparse(link)  

從關於此域可以區分作爲netloc。 xPath在這裏可能不是最好的,有人建議改進,但應該適合您的需求。

1

HTMLParser是乾淨的方式。如果你想要的東西快速和骯髒的,或者只是想看看一個比較複雜的正則表達式的樣子,這裏是一個例子正則表達式來找到HREF的(從我的頭頂,未測試):

r'<a\s+href="\w+://[^/"]+[^"]*">' 
1

鑑於你總是在域前有一個http協議說明符,這應該工作(txt是你的例子)。

import re 
[groups[0] for groups in re.findall(r'http://(\w+(\.\w+){1,})(/\w+)*', txt)] 

儘管如此,域的模式並不完美。

相關問題