Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用刮刀刮东西_Python_Xpath_Scrapy_Web Crawler_Scrapy Spider - Fatal编程技术网

Python 用刮刀刮东西

Python 用刮刀刮东西,python,xpath,scrapy,web-crawler,scrapy-spider,Python,Xpath,Scrapy,Web Crawler,Scrapy Spider,我已经编写了以下蜘蛛,用于抓取webmd站点进行患者评论 from scrapy.spider import BaseSpider from scrapy.selector import HtmlXPathSelector class MySpider(BaseSpider): name = "webmd" allowed_domains = ["webmd.com"] start_urls = ["http://www.webmd.com/drugs/drugrev

我已经编写了以下蜘蛛,用于抓取webmd站点进行患者评论

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector


class MySpider(BaseSpider):
    name = "webmd"
    allowed_domains = ["webmd.com"]
    start_urls = ["http://www.webmd.com/drugs/drugreview-92884-Boniva"]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        titles = hxs.select("//p")
        title = titles.select("//p[contains(@class, 'comment')and contains(@style, 'display:none')]/text()").extract()
        print(title)
执行这段代码会给我期望的输出,但会有很多重复,即相同的注释会重复至少10次。
请帮助我解决此问题。

您可以像这样重写spider代码:

import scrapy

# Your Items 
class ReviewItem(scrapy.Item):
    review = scrapy.Field()


class WebmdSpider(scrapy.Spider):
    name = "webmd"
    allowed_domains = ["webmd.com"]
    start_urls = ['http://www.webmd.com/drugs/drugreview-92884-Boniva']

    def parse(self, response):
        titles = response.xpath('//p[contains(@id, "Full")]')
        for title in titles:
            item = ReviewItem()
            item['review'] = title.xpath('text()').extract_first()
            yield item

        # Checks if there is a next page link, and keeping parsing if True    
        next_page = response.xpath('(//a[contains(., "Next")])[1]/@href').extract_first()
        if next_page:
            yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
它只选择完整的客户评论,不选择重复评论,并将其保存在中。 注意:您可以使用更方便的快捷方式
response
,而不是
HtmlXPathSelector
。另外,我将弃用的
scrapy.BaseSpider
更改为
scrapy.Spider


要将评论保存为csv格式,您只需使用Scrapy并在console中键入
Scrapy crawl webmd-o reviews.csv

您可以像这样重写爬行器代码:

import scrapy

# Your Items 
class ReviewItem(scrapy.Item):
    review = scrapy.Field()


class WebmdSpider(scrapy.Spider):
    name = "webmd"
    allowed_domains = ["webmd.com"]
    start_urls = ['http://www.webmd.com/drugs/drugreview-92884-Boniva']

    def parse(self, response):
        titles = response.xpath('//p[contains(@id, "Full")]')
        for title in titles:
            item = ReviewItem()
            item['review'] = title.xpath('text()').extract_first()
            yield item

        # Checks if there is a next page link, and keeping parsing if True    
        next_page = response.xpath('(//a[contains(., "Next")])[1]/@href').extract_first()
        if next_page:
            yield scrapy.Request(response.urljoin(next_page), callback=self.parse)
它只选择完整的客户评论,不选择重复评论,并将其保存在中。 注意:您可以使用更方便的快捷方式
response
,而不是
HtmlXPathSelector
。另外,我将弃用的
scrapy.BaseSpider
更改为
scrapy.Spider


要将评论保存为csv格式,您只需使用Scrapy并在console中键入
Scrapy crawl webmd-o reviews.csv

您可以使用
集合
获得唯一的评论。我希望您知道选择器将结果返回为
列表
,因此,如果使用集合,则只能得到唯一的结果。所以

def parse(self,response):
    hxs = HtmlXPathSelector(response)
    titles = hxs.select("//p")
    title = set(titles.select("//p[contains(@class, 'comment')and contains(@style, 'display:none')]/text()").extract())
    print (title) #this will have only unique results.

您可以使用
集合
获取唯一的注释。我希望您知道选择器将结果返回为
列表
,因此,如果使用集合,则只能得到唯一的结果。所以

def parse(self,response):
    hxs = HtmlXPathSelector(response)
    titles = hxs.select("//p")
    title = set(titles.select("//p[contains(@class, 'comment')and contains(@style, 'display:none')]/text()").extract())
    print (title) #this will have only unique results.

很高兴我能帮忙。另外,您最好将不推荐的
scrapy.BaseSpider
更改为
scrapy.Spider
。对于保存临时评论,您可以使用。您可以帮助我将评论保存在.csv文件中吗??每个评论位于不同的单元格中。是否有任何方法限制要删除的评论数量?页面包含153条评论,每页显示5条评论。你需要153的数字是多少?我总共只需要100条评论,很高兴我能帮上忙。另外,您最好将不推荐的
scrapy.BaseSpider
更改为
scrapy.Spider
。对于保存临时评论,您可以使用。您可以帮助我将评论保存在.csv文件中吗??每个评论位于不同的单元格中。是否有任何方法限制要删除的评论数量?页面包含153条评论,每页显示5条评论。你需要153条中的多少条?我总共只需要100条评论