Scrapy LinkExtractor无法使用mailto的href提取链接:

时间:2016-01-21 05:11:02

标签: python hyperlink scrapy

我使用LinkExtractor类从页面中提取所有链接

for link in LinkExtractor(allow=()).extract_links(response):
    print link.url

这将打印页面中的所有URL。但我似乎无法获得href等于mailto:link的链接。例如:

<a href="mailto:example@gmail.com">Mail</a>

我是否需要将一些参数传递给LinkExtractor以使其获取与mailto的链接:?

3 个答案:

答案 0 :(得分:1)

您不需要使用LinkExtractor来获取所需的网址,只需将xpath与响应对象一起使用即可。

all_links = response.xpath('//a/@href').extract()

LinkExtractor专注于获取要关注的链接,因此默认情况下它会避免mailto个链接。

答案 1 :(得分:1)

好吧,BeautifulSoup可以替代使用。

但这不会回答你的问题。问题的原因是LxmlLinkExtractor(这是scrapy中默认的LinkExtractor)有一个过滤(因为它扩展了FilteringLinkExtractor),它有一个lambda用于有效的URL并过滤它们。该表达式如下:

_is_valid_url = lambda url: url.split('://', 1)[0] in {'http', 'https', 'file'}

如您所见,mailto在这种情况下无效。

您可以在允许mailto作为有效网址的情况下编写自己的实现 - 但是您必须小心,因为LinkExtractors会自动创建Request并调用他们获取的网址,这样您就可以最终会收到电子邮件地址的例外情况。

如果您想收集电子邮件地址,请创建另一个解析器功能,您可以从网站中提取它们 - 并让LinkExtractor通过其所有内部链接浏览整个网站。

答案 2 :(得分:0)

为什么你没有使用BeautifulSoup来完成这项任务?

r = requests.get( url, params )

soup = BeautifulSoup( r.text, 'html.parser' )

#Getting all h3 tags with class 'r'
h3tags = soup.find_all( 'h3', class_='r' )

for h3 in h3tags: