为什么Scrapy在这里找不到href?

时间:2016-03-20 21:57:31

标签: python xpath scrapy

我正在尝试获取像这样的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')时,不会返回任何链接。

我不明白但是我已经2周了Scrapy!

1 个答案:

答案 0 :(得分:3)

如果您希望 li&#39> / p>

xpath('//li[@class="evt-click"]/@href'))

在您自己的例子中,您需要:

 xpath("./@href")

之所以不起作用的原因是因为您所寻找的链接中的html中不存在您所寻找的内容,有11个li class="evt-click"且没有任何一个href条,其中包含一个标记内的js:

enter image description here

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

添加到setting.py:

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

启动泊坞窗实例:

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也是另一种选择。