2016-09-30 5 views
2

Ich bekomme eine URL, die nicht verwendet werden kann, um Daten von der nächsten Seite zu holen, also eine base_url = 'http://www.marinetraffic.com' Variable erstellt und es scrapy übergeben anfordern. port_homepage_url = base_url + port_homepage_url. Es funktioniert gut, wenn ich das Ergebnis so erstelle. yield {'a': port_homepage_url, 'b':item['port_name']} Ich bekomme dieses Ergebnis, das ich wollte.TypeError: kann 'str' und 'NoneType' Objekte nicht verketten, wenn die benutzerdefinierte URL in scrapy.Request() platziert wird

http://www.marinetraffic.com/en/ais/index/ships/range/port_id:20585/port_name:FUJAIRAH%20ANCH,FUJAIRAH ANCH

aber wenn Platz in scrapy Anfrage yield scrapy.Request(port_homepage_url, callback=self.parse, meta={'item': item}) i erhalten Fehler

port_homepage_url = base_url + port_homepage_url 
TypeError: cannot concatenate 'str' and 'NoneType' objects 

hier Code ist

class GetVessel(scrapy.Spider): 
    name = "getvessel" 
    allowed_domains = ["marinetraffic.com"] 
    start_urls = [ 
     'http://www.marinetraffic.com/en/ais/index/ports/all/flag:AE', 
    ] 


    def parse(self, response): 
     item = VesseltrackerItem() 
     base_url = 'http://www.marinetraffic.com' 
     for ports in response.xpath('//table/tr[position()>1]'): 
      item['port_name'] = ports.xpath('td[2]/a/text()').extract_first() 
      port_homepage_url = ports.xpath('td[7]/a/@href').extract_first() 
      port_homepage_url = base_url + port_homepage_url 
      yield scrapy.Request(port_homepage_url, callback=self.parse, meta={'item': item}) 
+2

'ports.xpath ('td [7]/a/@ href'). Extract_first()' gibt zurück Keine, das ist sicher. Kann nicht sagen, warum, obwohl – lucasnadalutti

+0

Sie müssen sicherstellen, dass Ihre Variablen tatsächlich Werte haben, bevor sie nur an eine Funktion übergeben - nicht überprüfen den zurückgegebenen Wert eines Funktionsaufrufs ist in der Regel keine gute Idee. Ihr wirkliches Problem, wie @lucasnadalutti sagte, ist, dass Ihre Regex nichts zurückgibt. –

Antwort

2

Das Problem auf der ersten Start URL Seite nicht geschieht, passiert aber später, wenn nachfolgende Anfragen bearbeitet werden. Nehmen Sie zum Beispiel this page. Es gibt keine Verbindungen in dem 7. td Element und daher gibt ports.xpath('td[7]/a/@href').extract_first()None zurück, was zu einem Fehler auf der port_homepage_url = base_url + port_homepage_url-Linie führt.

Wie Sie das Problem angehen, hängt davon ab, was Sie auf den "Port" -Seiten vorhatten. Von dem, was ich verstehe, wollten Sie nicht wirklich die "Port" -Seitenanforderungen mit self.parse behandeln und müssen einen separaten Rückruf mit unterschiedlicher Logik innerhalb haben.

+0

ja ich hatte den Funktionsnamen in der Rückruffunktion falsch eingegeben. | ' Ausbeute scrapy.Request (port_homepage_url, Rückruf = self.parse_port_homepage, meta = {'item': item}) ' –

Verwandte Themen