Scrapy spider Indexfehler
-
05-07-2019 - |
Frage
Dies ist der Code für Spyder1, die ich innerhalb Scrapy Rahmen zu schreiben versucht habe:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from scrapy.item import Item
from firm.items import FirmItem
class Spider1(CrawlSpider):
domain_name = 'wc2'
start_urls = ['http://www.whitecase.com/Attorneys/List.aspx?LastName=A']
rules = (
Rule(SgmlLinkExtractor(allow=["hxs.select(
'//td[@class='altRow'][1]/a/@href').re('/.a\w+')"]),
callback='parse'),
)
def parse(self, response):
hxs = HtmlXPathSelector(response)
JD = FirmItem()
JD['school'] = hxs.select(
'//td[@class="mainColumnTDa"]').re('(?<=(JD,\s))(.*?)(\d+)'
)
return JD
SPIDER = Spider1()
Die Regex in der rules
erfolgreich zieht alle Bio-URLs, die ich von Anfang an url wollen:
>>> hxs.select(
... '//td[@class="altRow"][1]/a/@href').re('/.a\w+')
[u'/cabel', u'/jacevedo', u'/jacuna', u'/aadler', u'/zahmedani', u'/tairisto', u
'/zalbert', u'/salberts', u'/aaleksandrova', u'/malhadeff', u'/nalivojvodic', u'
/kallchurch', u'/jalleyne', u'/lalonzo', u'/malthoff', u'/valvarez', u'/camon',
u'/randerson', u'/eandreeva', u'/pangeli', u'/jangland', u'/mantczak', u'/darany
i', u'/carhold', u'/marora', u'/garrington', u'/jartzinger', u'/sasayama', u'/ma
sschenfeldt', u'/dattanasio', u'/watterbury', u'/jaudrlicka', u'/caverch', u'/fa
yanruoh', u'/razar']
>>>
Aber wenn ich den Code ausführen ich
[wc2] ERROR: Error processing FirmItem(school=[]) -
[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range
Dies ist der FirmItem in Items.py
from scrapy.item import Item, Field
class FirmItem(Item):
school = Field()
pass
Können Sie mir helfen, zu verstehen, wo der Index-Fehler auftritt?
Es scheint mir, dass es etwas mit SgmLinkExtractor .
Ich habe versucht, diese Spinne Arbeit für Wochen mit Scrapy zu machen. Sie haben eine hervorragende Anleitung, aber ich bin neu in Python und Web-Programmierung so verstehe ich nicht, wie zum Beispiel SgmlLinkExtractor
hinter den Kulissen funktioniert.
Wäre es einfacher für mich zu versuchen, eine Spinne mit der gleichen einfachen Funktionalität mit Python-Bibliotheken zu schreiben? Ich würde keine Kommentare schätzen und zu helfen.
Danke
Lösung
SgmlLinkExtractor unterstützt keine Wähler in seinem "erlauben" Argumente.
Das ist also falsch:
SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
Das ist richtig:
SgmlLinkExtractor(allow=[r"product\.php"])
Andere Tipps
Die Parsing-Funktion für jedes Spiel Ihres SgmlLinkExtractor genannt wird.
Wie Pablo erwähnt Sie Ihren SgmlLinkExtractor vereinfachen.
Ich habe auch versucht, die Namen aus der ursprünglichen URL in eine Liste gekratzt zu setzen und dann jeden Namen übergibt in Form von absoluter URL als http://www.whitecase.com/aabbas
(für / aabbas) zu analysieren.
Der folgende Code Schleifen über die Liste, aber ich weiß nicht, wie das passieren zu analysieren. Glauben Sie, das ist eine bessere Idee?
baseurl = 'http://www.whitecase.com'
names = ['aabbas', '/cabel', '/jacevedo', '/jacuna', '/igbadegesin']
def makeurl(baseurl, names):
for x in names:
url = baseurl + x
baseurl = 'http://www.whitecase.com'
x = ''
return url