为什么Scrapy无法在这里找到href?

3

我正在尝试获取像这样的html块中的多个href(对于格式不好看,抱歉,但我猜你需要所有内容):

<li class="evt-click" data-tab="yo" data-public="yoyo" data-tracking="1" data-tracking-tag="yo_name" data-tracking-params="{'type': 'yo'}" href="/the/url/i/want">
  <a href="javascript:void(0)">Yo</a>
</li>

我使用Scrapy进行爬虫,能够获取到所需的li元素,并将其保存为elmts。但是当我尝试使用elmts.xpath('@href')时,未返回任何链接。

我对此不太理解,因为我只接触Scrapy两周!

1个回答

3
如果您想要从具有“evt-click”类的
  • 中获取hrefs,则可以使用以下xpath:
    xpath('//li[@class="evt-click"]/@href'))
    

    在你自己的示例中,你需要:
     xpath("./@href")
    

    原因在于您所寻找的内容并不存在于提供的链接中的html中,有11个 li class="evt-click" 但是没有一个包含除了a标签内部js以外的href。

    enter image description here

    你可以使用 scrapy-splash 来允许页面完全渲染以获取动态生成的数据,你需要按照链接说明进行安装:

    在 setting.py 中添加:

    DOWNLOADER_MIDDLEWARES = {
        'scrapyjs.SplashMiddleware': 725,
    }
    

    启动Docker实例:

    docker run -p 8050:8050 scrapinghub/splash:
    

    然后这就足以获得你想要的数据:
    import scrapy
    
    class MySpider(scrapy.Spider):
        name = "deez"
        start_urls = ["http://www.deezer.com/profile/154723101"]
    
        def start_requests(self):
            for url in self.start_urls:
                yield scrapy.Request(url, self.parse, meta={
                    'splash': {
                        'endpoint': 'render.html',
                        'args': {'wait': 1}
                    }
                })
    
        def parse(self, response):
            print(response.xpath("//li[@class='evt-click']").extract())
    

    输出:

    $ scrapy crawl deez
    .............................
    2016-03-20 23:01:12 [scrapy] DEBUG: Crawled (200) <POST http://127.0.0.1:8050/render.html> (referer: None)
    [u'/profile/154723101/loved', u'/profile/154723101/playlists', u'/profile/154723101/albums', u'/profile/154723101/artists', u'/profile/154723101/radios', u'/profile/154723101/following', u'/profile/154723101/followers']
    

    selenium也是另一个选择。


  • 我也尝试过,但没有返回任何内容。我还尝试了xpath('//@href'),但只得到了javascript:void(0)的文本,没有其他内容。 - baptiste
    你能分享链接吗? - Padraic Cunningham
    你希望获取所有 evt-click 还是只获取特定的一个?实际上除了带有 evt-click 类的 li 标签内的 a 标签中的 javascript 之外,没有任何 href。 - Padraic Cunningham
    在HTML中也不存在{'type': 'yo'} - Padraic Cunningham
    这就是我这个新手的地方了。我并不是一个网站开发者,而更多的是嵌入式C语言开发者。我会检查一下的。谢谢。 - baptiste
    显示剩余11条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接