【问题标题】:Having trouble accessing xpath attribute with scrapy使用 scrapy 访问 xpath 属性时遇到问题
【发布时间】:2015-02-10 04:02:05
【问题描述】:

我目前正在尝试抓取以下网址: http://www.bedbathandbeyond.com/store/product/dyson-dc59-motorhead-cordless-vacuum/1042997979?categoryId=10562

在此页面上,我想提取列出的评论数量。也就是我要提取693这个数字。

这是我当前的 xpath:

sel.xpath('//*[@id="BVRRRatingSummaryLinkReadID"]/a/span/span')

它似乎只返回一个空数组,有人可以建议一个正确的 xpath 吗?

【问题讨论】:

    标签: python xpath web-scraping html-parsing scrapy


    【解决方案1】:

    在您使用 Scrapy 获得的初始页面上没有评论。问题是评论是通过大量使用 javascript 加载和构建的,这使得事情变得更加复杂。

    基本上,您的选择是:

    这是一个低级方法的工作示例,涉及使用 jsonslimit 解析 javascript 代码,从中提取 HTML 并通过 BeautifulSoup 解析它:

    import json
    
    from bs4 import BeautifulSoup
    import requests
    from slimit import ast
    from slimit.parser import Parser
    from slimit.visitors import nodevisitor
    
    ID = 1042997979
    
    url = 'http://bedbathandbeyond.ugc.bazaarvoice.com/2009-en_us/{id}/reviews.djs?format=embeddedhtml&sort=submissionTime'.format(id=ID)
    
    response = requests.get(url)
    
    parser = Parser()
    tree = parser.parse(response.content)
    data = ""
    for node in nodevisitor.visit(tree):
        if isinstance(node, ast.Object):
            data = json.loads(node.to_ecma())
            if "BVRRSourceID" in data:
                break
    
    soup = BeautifulSoup(data['BVRRSourceID'])
    print soup.select('span.BVRRCount span.BVRRNumber')[0].text
    

    打印693

    要使解决方案适应 Scrapy,您需要使用 Scrapy 而不是 requests 发出请求,并使用 Scrapy 而不是 BeautifulSoup 解析 HTML。

    【讨论】:

      【解决方案2】:

      你不能那样做。如果你只是从this url爬取html,你将找不到任何693的字符串。这个内容必须由一些AJAX代码动态创建。

      【讨论】:

      • 那么没有办法从HTML中获取response的值吗?
      • 您可能需要先利用 Webkit 或类似的东西来呈现网页。那会更复杂。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-10
      • 1970-01-01
      相关资源
      最近更新 更多