2016-12-12 10 views
1

Ich verwende Scrapy zum Crawlen und Scrape Daten von Websites, die hauptsächlich aus HTML-Seiten und PDF-Dateien besteht (Ich habe IGNORED_EXTENSIONS geändert Scraping PDFs).Extrahieren von Informationen aus Anchor-Elementen zu PDF-Dateien

Ich brauche Text zu extrahieren, die zwischen <a> Tags eingeschlossen ist:

<a href='some_document.pdf'>I need this text</a> 

Offensichtlich ich nicht response.text oder response.css tun können, da es nur zu lesenden Bytes (Sie eine bekommen Attributfehler).

Eine Sache, die mir in den Sinn kam, war, die Seite zu crawlen, alle Links von dieser Seite zu extrahieren und sie in der Textdatei zu speichern. Es funktionierte, außer dass ich mit vielen doppelten Links, Links, die kaputt waren (denke 403, 404, 500), oder mit vielen Links, die mir egal waren, endete. Ich denke, es muss einen besseren Weg geben!

Beim Lesen Scrapy Dokumentation stolperte ich über das Dokument für LxmlLinkExtractor. Dort im "Konstruktor", es hat 2 interessante Felder:

  • Tags (str oder Liste) - einen Tag oder eine Liste von Tags zu berücksichtigen, wenn Links zu extrahieren. Der Standardwert ist ('a', 'Bereich').
  • Attrs (Liste) - Ein Attribut oder eine Liste von Attributen, die bei der Suche nach zu extrahierenden Links berücksichtigt werden sollten (nur für die im Parameter tags angegebenen Tags). Der Standardwert ist (‚href‘)

Und das hat mir denken, ob es möglich ist, Werte eines Attribute eines <a> Element zu greifen, bevor sie kriechen. Hab ich recht? Und wenn ja, wie kann ich Text zwischen Tags greifen?

Quellcode:

class ArchiveSpider(CrawlSpider): 

...some code... 

rules = [ 
     Rule(LinkExtractor(allow=[re.compile('pdf', re.IGNORECASE)]), 
          callback='parse_pdf', 
          follow=True), 
     Rule(LinkExtractor(), callback='parse_item', follow=True) 
    ] 

    def parse_pdf(self, response): 
     yield dict(url=response.url) 

    def parse_item(self, response): 
     if re.search(re.compile('pdf', re.IGNORECASE, response.headers.get('Content-Type').decode('utf-8')): 
      parse_pdf(self, response) 
     title = response.css('title::text').extract()[0].strip() if response.css('title::text') else '' 
     yield dict(title=title, url=response.url) 

Antwort

0

Ich bin nicht sicher, ob ich Sie richtig verstehe, aber könnten Sie so etwas wie dies nicht tun:

text = response.xpath('//a/text()').extract() 

Sie werden die gewünschten angeben müssen <a> -elements im xpath wählt die text() den Text zwischen den Tags aus.

Verwandte Themen