使用Scrapy的正则表达式

时间:2017-10-31 08:41:43

标签: python-3.x scrapy

我正在练习用Scrapy抓报纸的文章。我在网页中对字符串进行子字符串处理时遇到了一些问题。借助内置的rere_first功能,我可以设置开始搜索的位置,但我找不到如何设置结束位置。 以下是代码:

import scrapy 
from spider.items import Articles 
from scrapy.selector import Selector
from scrapy.http import HtmlResponse

class QuotesSpider(scrapy.Spider):
    name = "lastampa"
    allowed_domains = ['lastampa.it']

    def start_requests(self):
        urls = [
                'http://www.lastampa.it/2017/10/26/economia/lavoro/datalogic-cerca-laureati-e-laureandi-per-la-ricerca-e-sviluppo-rPsS8gVM5ZX7gEZcugklwJ/pagina.html'
                ]

        yield scrapy.Request(url=url, callback=self.parse)

    def parse(self, response):

        items = []

        item = Articles()
        item['date'] = response.xpath('//div[contains(@class, "ls-articoloDataPubblicazione")]').re_first(r'content=\s*(.*)')
        item['author'] = response.xpath('//div[contains(@class, "ls-articoloAutore")]').re_first(r'">\s*(.*)')
        item['title'] = response.xpath('//div[contains(@class, "ls-articoloTitolo")]').re_first(r'<h3>\s*(.*)')
        item['subtitle'] = response.xpath('//div[contains(@class, "ls-articoloCatenaccio")]').re_first(r'">\s*(.*)')
        item['text'] = response.xpath('//div[contains(@class, "ls-articoloTesto")]').re_first(r'<p>\s*(.*)')
        items.append(item)

好吧,使用这段代码,我可以获得所需的文本,但也可以获得以下所有标记,直到路径结束。 e.g。

'subtitle': 'Gli inserimenti saranno in Italia, Stati Uniti, Cina, Vietnam</div>'

如何逃避结束</div>(或定义点后的任何其他字符)? 有人可以打开这个灯。感谢

1 个答案:

答案 0 :(得分:0)

如果您只需要从元素中提取文本,则不必混淆这样的正则表达式。只需在XPath表达式中使用text()即可。例如,对于subtitle字段,请使用以下字段提取它:

item['subtitle'] = response.xpath('//div[contains(@class, "ls-articoloCatenaccio")]/text()').extract_first().strip()

在您的示例中,将生成:

u'Gli inserimenti saranno in Italia, Stati Uniti, Cina, Vietnam'

text条有点复杂,因为它分散在子元素上。但是,您可以从那里提取它,对其进行后处理并将其存储为单个字符串,如下所示:

item['text'] = ''.join([x.strip() for x in response.xpath('//div[contains(@class, "ls-articoloTesto")]//text()').extract()])

将产生:

u'Datalogic, leader mondiale nelle tecnologie di identificazione automatica dei dati e dei processi di automazione industriale, ha lanciato la selezione di giovani talenti laureati o laureandi in ingegneria e/o in altre materie scientifiche che abbiano voglia di confrontarsi con una realt\xe0 internazionale. Il primo step delle selezioni si \xe8 tenuto in occasione dell\u2019Open Day: i candidati hanno sostenuto un primo colloquio con senior manager nazionali e internazionali, arrivati per l\u2019occasione anche da sedi estere. Durante l\u2019Open Day \xe8 stata presentata l\u2019azienda insieme alle 80 posizioni aperte di cui una cinquantina in Italia. La ricerca dei candidati \xe8 rivolta a laureandi e neolaureati di tutta Italia interessati a far parte di una realt\xe0 dinamica e internazionale, provenienti da Facolt\xe0 tecnico-scientifiche quali Ingegneria, Fisica, Informatica.Ai giovani verr\xe0 proposto un interessante percorso di carriera che permetter\xe0 di approfondire e sviluppare tecnologie all\u2019avanguardia nei 10 centri di Ricerca dell\u2019azienda dislocati tra Italia, Stati Uniti, Cina e Vietnam, dove si ha l\u2019opportunit\xe0 di approfondire tutte le tematiche relative all\u2019elettronica e al software design: dallo sviluppo di sistemi operativi mobili, di sensori laser e tecnologie ottiche, allo studio di sistemi di intelligenza artificiale. Informazioni sul sito www.datalogic.com.Alcuni diritti riservati.'