2017-02-10 1 views
0

Also, ich habe einen Crawler, die einige Daten aus Meta-Tags im Kopf und einige Element-Tags im Körper extrahieren müssen.Scrapy: So wählen Kopf und Körper Tags zusammen

Wenn ich versuche, dieses

für Kurse in response.xpath ("// html"):

und diese

für Kurse in response.xpath (“ // Kopf "):

es holt nur Daten von den Metatags im <head>... </head> tag.

wenn ich versuche, diesen

für Kurse in response.xpath ("// body"):

es nur Daten aus den Tags im HTML-Tag <body>... </body> holen.

Wie kombiniere ich diese 2-Selektoren, ich habe auch versucht,

für Kurse in response.xpath ("// Kopf | // body"):

aber es kehrte nur ' Meta-Tags aus <head>... </head>, nichts wurde aus dem Körper extrahiert.

Ich habe auch versucht, diese

für Kurse in response.xpath ("// *"):

es funktioniert, aber das ist sehr ineffizient und erfordert viel Zeit zu extrahieren . Ich bin mir sicher, dass es einen effizienteren Weg gibt, dies zu tun.

Und hier ist Scrapy Code, wenn es hilft ...

Die ersten 2 Elemente (Seitentyp, pagefeatured) unter yeild in <head> ... <head> Tag sind. Die letzten zwei Elemente (coursetloc, coursetfees) sind in <body ... </body> Tag

Und ja, kann es seltsam aussehen, aber es gibt ‚Meta‘ Tags innerhalb <body>...</body> in der Website von wo ich bin Schaben.

class MySpider(BaseSpider): 
name = "dkcourses" 
start_urls = ['http://www.example.com/scrapy/all-courses-listing'] 
allowed_domains = ["example.com"] 
def parse(self, response): 
hxs = Selector(response) 
for courses in response.xpath("//body"): 
yield { 
      'pagetype': ''.join(courses.xpath('.//meta[@name="dkpagetype"]/@content').extract()), 
      'pagefeatured': ''.join(courses.xpath('.//meta[@name="dkpagefeatured"]/@content').extract()), 
      'coursetloc': ''.join(courses.xpath('.//meta[@name="dkcoursetloc"]/@content').extract()), 
      'coursetfees': ''.join(courses.xpath('.//meta[@name="dkcoursetfees"]/@content').extract()), 
      } 
for url in hxs.xpath('//ul[@class="scrapy"]/li/a/@href').extract()): 
    yield Request(response.urljoin(url), callback=self.parse) 

Jede Hilfe wird sehr geschätzt. Dank

+0

Post URL oder HTML-Code –

+0

@ 宏杰 李 den Code der Veröffentlichung ... – Slyper

+0

ich die URL der Website –

Antwort

1
  1. Verwenden extract_first() den ersten Wert in den extract() zu bekommen, nicht join()
  2. Verwenden [starts-with(@name, "dkn")] zu finden, um den meta-Tag verwendet, bedeutet //meta in all dem Inhalt des Dokuments.

In [5]: for meta in response.xpath('//meta[starts-with(@name, "dkn")]'): 
    ...:  name = meta.xpath('@name').extract_first() 
    ...:  content = meta.xpath('@content').extract_first() 
    ...:  print({name:content}) 

aus:

{'dknpagetype': 'Course'} 
{'dknpagefeatured': ''} 
{'dknpagedate': '2016-01-01'} 
{'dknpagebanner': 'http://www.deakin.edu.au/__data/assets/image/0006/757986/Banner_Cyber-Alt2.jpg'} 
{'dknpagethumbsquare': 'http://www.deakin.edu.au/__data/assets/image/0009/757989/SQ_Cyber1-2.jpg'} 
{'dknpagethumblandscape': 'http://www.deakin.edu.au/__data/assets/image/0007/757987/LS_Cyber1-1.jpg'} 
{'dknpagethumbportrait': 'http://www.deakin.edu.au/__data/assets/image/0008/757988/PT_Cyber1-3.jpg'} 
{'dknpagetitle': 'Graduate Diploma of Cyber Security'} 
{'dknpageurl': 'http://www.deakin.edu.au/course/graduate-diploma-cyber-security'} 
{'dknpagedescription': "Take your understanding of cyber security to the next level with Deakin's Graduate Diploma of Cyber Security and build your capacity to investigate and combat cyber-crime."} 
{'dknpageid': '723503'} 
+0

Dank bedeuten, aber ich möchte speichern die Werte in Variablen, um die Werte an Elasticsearch zu senden, nicht nur auf dem Bildschirm, so wie Sie es in meinem obigen Beispielcode sehen. – Slyper

+0

Macht nichts, alles, was ich in meinem Code ändern musste, ist dies für Kurse in response.xpath ("// body") zu ändern: "to" für Kurse in response.xpath ("// meta"): 'All gut jetzt .... – Slyper

Verwandte Themen