我目前正在尝试抓取以下网址: http://www.bedbathandbeyond.com/store/product/dyson-dc59-motorhead-cordless-vacuum/1042997979?categoryId=10562
在此页面上,我想提取列出的评论数。即我要提取数字693。
这是我当前的 xpath:
sel.xpath('//*[@id="BVRRRatingSummaryLinkReadID"]/a/span/span')
它似乎只返回一个空数组,有人可以建议一个正确的 xpath 吗?
最佳答案
在您使用 Scrapy 获得的初始页面上没有评论。问题是评论是通过大量使用 javascript 加载和构建的,这使事情变得更加复杂。
基本上,您的选择是:
- 高级方法(例如,使用带有
selenium
的真实浏览器)。你甚至可以结合使用 Scrapy 和 Selenium: - 中级方法:
scrapy
+scrapyjs
- 低级方法(找出评论的构建位置并获取它们)
这是一个涉及使用 json
解析 javascript 代码的低级方法的工作示例和 slimit
, 从中提取 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
解析 HTML而不是 BeautifulSoup
。
关于python - 无法使用 scrapy 访问 xpath 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27426768/