使用scrapy查找正文中的电子邮件地址

时间:2016-04-11 19:04:48

标签: python xpath scrapy

我正在尝试使用scrapy查找网页上的所有电子邮件地址。

我找到了一个应该返回电子邮件地址的xpath,但是当我运行下面的代码时,它找不到任何电子邮件地址(我知道那里有)。我得到的错误如下:

文件" C:\ Anaconda2 \ lib \ site-packages \ scrapy \ selector \ unified.py",第100行,在  XPath的     提高ValueError(msg,如果是six.PY3,则为msg.encode(" unicode_escape")) ValueError:无效的XPath:// [-aAA-Z0-9.] +@ [ - -AA-Z0-9 ] +。[ - azA-Z0-9_.]+

这就是我的代码。有人能告诉我我做错了吗?

我已将问题缩小到xpath,但无法弄清楚如何修复它。

import scrapy
import datetime
from scrapy.spiders import CrawlSpider
from techfinder.items import EmailItem
from scrapy.selector import HtmlXPathSelector


class DetectSpider(scrapy.Spider):
    name = "test"

    alloweddomainfile = open("emaildomains.txt")
    allowed_domains = [domain.strip() for domain in alloweddomainfile.readlines()]
    alloweddomainfile.close()

    starturlfile = open("emailurls.txt")
    start_urls = [url.strip() for url in starturlfile.readlines()]
    starturlfile.close()


    def parse(self, response):




        hxs = HtmlXPathSelector(response)


        emails = hxs.xpath('//[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+').extract()             
        #[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+
        #<a\s+href=\"mailto:([a-zA-Z0-9._@]*)\
        #/^(|(([A-Za-z0-9]+_+)|([A-Za-z0-9]+\-+)|([A-Za-z0-9]+\.+)|([A-Za-z0-9]+\++))*[A-Za-z0-9]+@((\w+\-+)|(\w+\.))*\w{1,63}\.[a-zA-Z]{2,6})$/i



        emailitems = []
        for email in zip(emails):
            emailitem = EmailItem()
            emailitem["email"] = emails
            emailitem["source"] = response.url
            emailitem["datetime"] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            emailitems.append(emailitem)
        return emailitems

2 个答案:

答案 0 :(得分:2)

您可以在response.body上使用正则表达式搜索来查找电子邮件ID。

emails = re.findall(r'[\w\.-]+@[\w\.-]+', response.body)

答案 1 :(得分:2)

根据Doctor Strange的回答,你可以使用scrapy的内置正则表达式功能。这种方式有点整洁,你不必导入re。

这一行是问题

emails = hxs.xpath('//[-a-zA-Z0-9._]+@[-a-zA-Z0-9_]+.[a-zA-Z0-9_.]+').extract() 

您正在使用xpath选择器,但这是您已经放入的正则表达式模式。如果您将其更改为:

emails = hxs.xpath('//body').re('([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)')

这将为您提供正文中的电子邮件列表。