Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从电子邮件正文中提取域_Python_Regex - Fatal编程技术网

Python 从电子邮件正文中提取域

Python 从电子邮件正文中提取域,python,regex,Python,Regex,我想知道是否有任何方法可以从python中的电子邮件正文中提取域名。我曾考虑过使用正则表达式,但我写正则表达式的能力不太强,不知道是否有人能帮我。以下是电子邮件正文示例: <tr><td colspan="5"><font face="verdana" size="4" color="#999999"><b>Resource Links - </b></font><span class="snv"><a h

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

谢谢

您可以使用Python标准库访问文档的某些部分。

您可以使用Python标准库访问文档的某些部分

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在这里可能不是最好的,请有人提出改进建议,但应该适合您的需要


从此,域可以区分为netloc。xPath在这里可能不是最好的,请有人提出改进建议,但应该适合您的需要

HTMLPasser是一种干净的方法。如果您想要快速而肮脏的东西,或者只是想看看中等复杂的正则表达式是什么样子,下面是一个示例正则表达式,可以在我的脑海中找到href's,未经测试:

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

HTMLPasser是一种干净的方法。如果您想要快速而肮脏的东西,或者只是想看看中等复杂的正则表达式是什么样子,下面是一个示例正则表达式,可以在我的脑海中找到href's,未经测试:

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

假设您在域前面总是有一个http协议说明符,这应该是您的示例

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

不过,域的模式并不完美。

如果域前面总是有一个http协议说明符,那么这应该可以工作。txt就是您的示例

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

不过,域的模式并不完美。

最干净的方法是使用cssselect from lxml.html和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数据加载到文档对象中。您可以使用带有cssselect的标准css选择器查询文档中的链接。您可以遍历这些链接,使用.attrib['href']获取它们的URL-如果它们没有任何链接,则跳过它们-继续。使用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属性的锚。

最干净的方法是使用cssselect from lxml.html和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数据加载到文档对象中。您可以使用带有cssselect的标准css选择器查询文档中的链接。您可以遍历这些链接,使用.attrib['href']获取它们的URL-如果它们没有任何链接,则跳过它们-继续。使用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属性的锚。

regex非常强大,值得学习使用。我不使用Python,但不同语言的正则表达式非常相似。你可以自己动手构建一个正则表达式,在你学习了语法之后就不难了。哦,我的天哪,不要用正则表达式来解析HTMLRegex,它们非常强大,所以值得学习使用。我不使用Python,但不同语言的正则表达式非常相似。在学习语法后,您可以自己查看并尝试构建正则表达式,这并不难。哦,天哪,不要使用正则表达式解析HTMLY您甚至可以使用cssselect:doc.cssselect'a[href]筛选具有href属性的元素您甚至可以使用cssselect:doc.cssselect'a[href]筛选具有href属性的元素