无法使用scrapy访问xpath属性

时间:2014-12-11 15:43:52

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

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

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

这是我目前的xpath:

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

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

2 个答案:

答案 0 :(得分:4)

您在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。< / p>

答案 1 :(得分:0)

你做不到。如果您只是从this url抓取了html,则找不到任何693字符串。此内容必须由某些AJAX代码动态创建。