我目前正在尝试抓取以下网址: http://www.bedbathandbeyond.com/store/product/dyson-dc59-motorhead-cordless-vacuum/1042997979?categoryId=10562
在此页面上,我想提取列出的评论数量。也就是说,我想提取数字693。
这是我目前的xpath:
sel.xpath('//*[@id="BVRRRatingSummaryLinkReadID"]/a/span/span')
似乎只返回一个空数组,有人可以建议一个正确的xpath吗?
答案 0 :(得分:4)
您在Scrapy的初始页面上没有评论。问题是通过大量使用javascript来加载和构建评论,这使得事情变得更加复杂。
基本上,您的选择是:
这是一个低级方法的工作示例,涉及使用json
和slimit
解析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代码动态创建。