gpt4 book ai didi

python - Scrapy 没有给出手机所有评论的单独结果?

转载 作者:行者123 更新时间:2023-12-01 04:40:25 25 4
gpt4 key购买 nike

这段代码给了我结果,但输出不符合预期。我的 xpath 有什么问题吗?如何将规则迭代 +10。我总是在这两个方面遇到问题。

    import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from urlparse import urljoin


class CompItem(scrapy.Item):
title = scrapy.Field()
link = scrapy.Field()
data = scrapy.Field()
name_reviewer = scrapy.Field()
date = scrapy.Field()
model_name = scrapy.Field()
rating = scrapy.Field()
review = scrapy.Field()



class criticspider(CrawlSpider):
name = "flip_review"
allowed_domains = ["flipkart.com"]

start_urls = ['http://www.flipkart.com/samsung-galaxy-s5/product-reviews/ITME5Z9GKXGMFSF6?pid=MOBDUUDTADHVQZXG&type=all']
rules = (
Rule(
SgmlLinkExtractor(allow=('.*\&start=.*',)),
callback="parse_start_url",
follow=True),
)

def parse_start_url(self, response):
sites = response.css('div.review-list div[review-id]')
items = []
model_name = response.xpath('//h1[@class="title"]/text()').re(r'Reviews of (.*?)$')
for site in sites:
item = CompItem()
item['model_name'] = model_name
item['name_reviewer'] = ''.join(site.xpath('.//div[contains(@class, "date")]/preceding-sibling::*[1]//text()').extract())
item['date'] = site.xpath('.//div[contains(@class, "date")]/text()').extract()
item['title'] = site.xpath('.//div[contains(@class,"line fk-font-normal bmargin5 dark-gray")]/strong/text()').extract()
item['review'] = site.xpath('.//span[contains(@class,"review-text")]/text()').extract()
yield item

我的输出是:

 {'date': [u'\n 31 Mar 2015 ', u'\n 23 Mar 2015 '],
'model_name': [u'\n Reviews of A & K 333 '],
'name_reviewer': [u'\n pradeep kumar', u'\n vikas agrawal']}

我希望我的输出是:

{model_name :xyz
name_reviewer :abc
date:38383
}
{model_name :xyz
name_reviewer :hfhd
date:9283
}

我认为问题出在我的 XPath 上。

最佳答案

首先,您的 XPath 表达式通常非常脆弱

您的方法的主要问题是 site不包含评论部分,但它应该包含。换句话说,您不会迭代页面上的审阅 block 。

此外,模型名称应该在循环之外提取,因为页面上的每个评论都相同。我也会使用.re()从标题中提取型号名称,例如SAMSUNG GALAXY S5REVIEWS OF SAMSUNG GALAXY S5 .

这是应用了修复的完整工作代码:

def parse_start_url(self, response):
sites = response.css('div.review-list div[review-id]')

model_name = response.xpath('//h1[@class="title"]/text()').re(r'Reviews of (.*?)$')[0].strip()
for site in sites:
item = CompItem()
item['model_name'] = model_name
item['name_reviewer'] = ''.join(site.xpath('.//div[contains(@class, "date")]/preceding-sibling::*[1]//text()').extract()).strip()
item['date'] = site.xpath('.//div[contains(@class, "date")]/text()').extract()[0].strip()
yield item

XPath 表达式也变得更简单。举个例子,评论部分由 CSS 选择器 div.review-list div[review-id] 标识。这将匹配所有 div包含 review-id 的元素div 下任意位置的属性有review-list类。

另外,请注意 name_reviewer被提取 - 由于有不同的用户,其中一些表示为个人资料链接,一些未注册并位于 span 中与 review-username类 - 我采取了不同的方法:找到审阅日期并获取第一个前同级的文本。

<小时/>

我想指出类名如 line , fk-font-small , fk-font-11 etc 是面向布局的类,一般来说,并不是依赖 XPath 表达式和 CSS 选择器的好选择。请注意,使用哪些类来定位答案中的元素:review-list , title , date - 它们更加以数据为导向,是您定位器的更好选择。

关于python - Scrapy 没有给出手机所有评论的单独结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30796619/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com