SgmlLinkExtractor()不提取所有URL

时间:2014-01-22 12:51:38

标签: web-scraping scrapy

Hy all,

我有一个奇怪的问题。

似乎Scrapy没有从页面中提取所有现有的URL。即它找到/提取在这种类型的标签上找到的URL:

<a href="https://www.mysite.com/members/foreign-members" class="..." title="">

            Foreign members
</a>

但它没有找到/提取此类标记上的网址:

<a class="..." style="..." href="https://www.mysite.com/members/members/8199" title="...">
    ...
    <span title="...">...</span>
</a>

可能是什么问题? 因为href属性不是第一个?我注意到,当href不是第一个属性时,它找不到URL。就像你看到的那样,我没有任何正则表达式来定义要提取的URL,所以它应该提取所有这些URL。

以下是我的蜘蛛代码示例:

class MySpider(CrawlSpider):
    name = 'S'                                        
    start_urls = ['https://www.mysite.com/members/members/']

    rules = (
        Rule(SgmlLinkExtractor(), callback = 'parse_members'),           
    )
    ...

有人有解决方案吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

我用firebug查看你分享的链接,打开'net'部分并意识到这是你想要的链接:

$ scrapy shell "https://www.knaw.nl/en/members/members/@@faceted_query?b_start[]=0&version=cb403bd0d9fed8ab5ee81b142c8d1f9a"
...
>>> sel.xpath('//a/@href').extract()
[u'https://www.knaw.nl/en/members/members/8199', 
 u'https://www.knaw.nl/en/members/members/8199', 
 u'https://www.knaw.nl/en/members/members/3786', 
 u'https://www.knaw.nl/en/members/members/3786',
 ...]

这可以在蜘蛛中使用:

from scrapy.spider import BaseSpider
from scrapy.selector import Selector

class MySpider(BaseSpider):
    ...
    start_urls = ['https://www.knaw.nl/en/members/members/@@faceted_query?b_start[]=0&version=cb403bd0d9fed8ab5ee81b142c8d1f9a']

    def parse(self, response):
        sel = Selector(response)
        for link in sel.xpath('').extract():
            yield Request(url=link, callback=self.some_function_to _extract_page)

使用此网址,您还可以将CrawlSpider与SgmlLinkExtractor一起使用:

>>> from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
>>> SgmlLinkExtractor().extract_links(response)
[Link(url='https://www.knaw.nl/en/members/members/8199', .....]

作为附注,注意链接看起来是相同的两次,你可以尝试提取它们一次让scrapy过滤它们,它自动完成,所以在默认情况下,scrapy不会刮两次。