这段代码给了我结果,但是输出却不是期望的。我的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不包含审阅部分,但应该包含。换句话说,您不会遍历页面上的审阅块。

另外,模型名称应从循环外部提取,因为页面上的每个评论都相同。我还将使用.re()从标题中提取模型名称,例如SAMSUNG GALAXY S5个,REVIEWS 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的提取方式-由于存在不同的用户,其中一些表示为配置文件链接,一些未注册,并且位于spanreview-username类中-我采取了不同的方法方法:确定审查日期并获取前面的第一个兄弟姐妹的文本。



我想指出的是,像linefk-font-smallfk-font-11这样的类名称是面向布局的类,通常来说,它们不是依靠XPath表达式和CSS选择器的好选择。请注意,使用什么类来定位答案中的元素:review-listtitledate-它们更面向数据,是定位器的更好选择。

关于python - cra草不给电话的所有评论的个人结果?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30796619/

10-12 22:42