我使用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的链接:?
答案 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: