【问题标题】:Why Scrapy cannot find href here?为什么 Scrapy 在这里找不到 href?
【发布时间】:2016-03-21 07:04:43
【问题描述】:

我正在尝试获取几个像这样的 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 已经 2 周大了!

【问题讨论】:

    标签: python xpath scrapy


    【解决方案1】:

    如果你想要 li's 中的 hrefsevt-click 类,你可以使用以下 xpath:

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

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

     xpath("./@href")
    

    这两个都不起作用的原因是因为您提供的链接中的 html 中不存在您要查找的内容,有 11 个 li class="evt-click" 并且没有一个包含 a 标签内的 js 的任何 href 栏:

    您可以使用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) 文本,没有其他任何东西。
    • 可以分享链接吗?
    • 您想要所有的evt-click's 还是只想要一个?实际上,在类 evt-click 的任何 li 中,a 标记内的 javascript 都没有 href 栏
    • html中也不存在{'type': 'yo'}
    • (./@href) 建议也不起作用。我基本上可以拿一个特别的废料,对我想要的所有废料做同样的事情。但是我想拥有来自所有 evt-click 的所有 href 是一种干净的方式。如果我找不到办法,我可能会直接填写我想要的网址
    猜你喜欢
    • 2015-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2021-11-08
    • 2019-09-09
    • 2020-11-14
    • 2016-11-22
    相关资源
    最近更新 更多