Ошибка индекса паука Scrapy - PullRequest
2 голосов
/ 26 ноября 2009

Это код для Spyder1, который я пытался написать в рамках Scrapy:

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()

Регулярное выражение в rules успешно извлекает все биологические URL, которые я хочу, из стартового URL:

>>> 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']
>>>

Но когда я запускаю код, я получаю

[wc2] ERROR: Error processing FirmItem(school=[]) - 

[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range

Это FirmItem в Items.py

from scrapy.item import Item, Field

class FirmItem(Item):
    school = Field()

    pass

Можете ли вы помочь мне понять, где происходит ошибка индекса?

Мне кажется, что это как-то связано с SgmLinkExtractor .

Я пытался заставить этого паука работать с Scrapy неделями. У них отличное учебное пособие, но я новичок в python и веб-программировании, поэтому не понимаю, как, например, SgmlLinkExtractor работает за кулисами.

Будет ли мне проще написать паука с такой же простой функциональностью с библиотеками Python? Буду признателен за любые комментарии и помощь.

Спасибо

Ответы [ 3 ]

1 голос
/ 26 ноября 2009

SgmlLinkExtractor не поддерживает селекторы в аргументе allow.

Так что это неправильно:

SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])

Это верно:

SgmlLinkExtractor(allow=[r"product\.php"])
0 голосов
/ 27 ноября 2009

Я также попытался поместить имена, соскобленные с исходного URL-адреса, в список, а затем передать каждое имя для анализа в форме абсолютного URL-адреса как http://www.whitecase.com/aabbas (для / aabbas).

Следующий код зацикливается на списке, но я не знаю, как передать это на анализ. Как вы думаете, это лучшая идея?

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
0 голосов
/ 26 ноября 2009

Функция анализа вызывается для каждого совпадения вашего SgmlLinkExtractor.

Как упоминал Пабло, вы хотите упростить свой SgmlLinkExtractor.

...