Выход Scrap CrawlSpider с пробелами и функциями - PullRequest
0 голосов
/ 25 июня 2018

Я сейчас пишу скребок со скрапом. Я хочу сканировать весь текст, который отображается на сайте, не одну страницу, а все подстраницы. Я # использую CrawlSpider, потому что я думаю, что он сделан для того, чтобы также очистить другие страницы. Вот код, который я написал до сих пор:

import scrapy
from scrapy.spiders import CrawlSpider, Rule
from scrapy.linkextractors import LinkExtractor
from scrapy.exporters import XmlItemExporter

class MySpider(CrawlSpider):
    name = 'eship2'
    allowed_domains = ['tlk-energy.com']
    start_urls = ['http://www.tlk-energy.com']

    rules = [Rule(LinkExtractor(), callback='parse_item', follow=True)] # Follow any link scrapy finds (that is allowed).

    def parse_item(self, response):
        item = dict()
        item['url'] = response.url
        item['title'] = response.meta['link_text']
        item['body'] = '\n'.join(response.xpath('//text()').extract())
        return item

Я получаю вывод, который очень хорошо соответствует моим пожеланиям, но у меня все еще много таких вкладок и пробелов, как этот:

> Wärmepumpen- Klimakreislauf E-Fahrzeug
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Projektbeschreibung   
> 
> Nulla at nulla justo, eget luctus tortor. Nulla facilisi. Duis aliquet
> egestas purus in blandit. Curabitur vulputate, ligula lacinia
> scelerisque tempor, lacus lacus ornare ante, ac egestas est urna sit
> amet arcu.

, а также такой текст:

  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
  (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
  m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
  })(window,document,'script','https://www.google-analytics.com/analytics.js','ga');

  ga('create', 'UA-77796939-1', 'auto');
  ga('send', 'pageview');

Мне просто нужен файл, например, xml, где отображается текст веб-сайта и, возможно, URL, где был найден текст.

1 Ответ

0 голосов
/ 29 июня 2018

Вам нужно добавить некоторую постобработку, чтобы очистить результаты:

  1. Чтобы удалить текст JavaScript и CSS из ваших результатов, используйте:

    results = response.xpath( '//*[not(self::script or self::style)]/text()' ).extract()

  2. Затем примените strip и if для удаления пустых строк:

    text = " ".join([x.strip() for x in results if x.strip()])

...