Python 使用scrapy访问xpath属性时遇到问题

Python 使用scrapy访问xpath属性时遇到问题,python,xpath,web-scraping,html-parsing,scrapy,Python,Xpath,Web Scraping,Html Parsing,Scrapy,我当前正在尝试删除以下url: 在这个页面上,我想提取列出的评论数量。也就是说,我想提取数字693 这是我当前的xpath: sel.xpath('//*[@id="BVRRRatingSummaryLinkReadID"]/a/span/span') 它似乎只返回一个空数组,有人能建议一个正确的xpath吗?你不能这样做。如果只是从中抓取html,则不会找到任何693字符串。这些内容必须由一些AJAX代码动态创建 你不能那样做。如果只是从中抓取html,则不会找到任何693字符串。这些内容

我当前正在尝试删除以下url:

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

这是我当前的xpath:

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

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

你不能这样做。如果只是从中抓取html,则不会找到任何693字符串。这些内容必须由一些AJAX代码动态创建

你不能那样做。如果只是从中抓取html,则不会找到任何693字符串。这些内容必须由一些AJAX代码动态创建

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

基本上,您的选择是:

  • 一种高级方法(例如,使用真正的浏览器和)。您甚至可以将Scrapy和Selenium结合使用:
  • 中级方法:
    scrapy
    +
  • 低级方法(找出评审的构建位置并获取评审)
下面是一个低级方法的工作示例,涉及使用and解析javascript代码,从中提取HTML并通过以下方式进行解析:

打印
693


要使解决方案适应Scrapy,您需要使用
Scrapy
而不是
requests
发出请求,并使用
Scrapy
而不是
BeautifulSoup
解析HTML。使用Scrapy获得的初始页面上没有任何评论。问题是这些评论是通过大量使用javascript加载和构建的,这使得事情变得更加复杂

基本上,您的选择是:

  • 一种高级方法(例如,使用真正的浏览器和)。您甚至可以将Scrapy和Selenium结合使用:
  • 中级方法:
    scrapy
    +
  • 低级方法(找出评审的构建位置并获取评审)
下面是一个低级方法的工作示例,涉及使用and解析javascript代码,从中提取HTML并通过以下方式进行解析:

打印
693


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

解析HTML,因此无法从HTML中获得响应值?您可能需要利用Webkit或类似的工具来首先呈现网页。这将更加复杂。因此没有办法从HTML中获得响应的值?您可能需要利用Webkit或类似的东西来首先呈现网页。这将更加复杂。
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