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
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})
'ports.xpath ('td [7]/a/@ href'). Extract_first()' gibt zurück Keine, das ist sicher. Kann nicht sagen, warum, obwohl – lucasnadalutti
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. –