2009-11-26 2 views
2

Это код Spyder1, что я пытался писать в Scrapy рамках: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 успешно тянет все био URLs, что я хочу с самого начала 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 

Это FirmIt em в Items.py

from scrapy.item import Item, Field 

class FirmItem(Item): 
    school = Field() 

    pass 

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

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

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

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

Благодаря

+0

Я не думаю, что это вообще в LinkExtractor; мне кажется, что это что-то, участвующее в методе анализа, который ищет школу, от которой зависит степень. – inklesspen

+0

Хорошо. Тогда я думаю, мне нужно добавить цикл for для синтаксического анализа, чтобы он искал JD в каждом URL-адресе, возвращаемом LinkExtractor? Но я не понимаю отношения между LinkExtractor и parse. Учебник здесь http://doc.scrapy.org/intro/tutorial.html#extracting-the-data имеет цикл for в синтаксическом анализе, но он использует вложенные hxs. Непонятно, как я могу реализовать это в моем случае, когда у меня есть только 1 регулярное выражение. – Zeynel

+0

Всегда используйте строковый литерал для строк, которые могут содержать регулярные выражения, например, вместо '\ w +' использовать r '\ w +'. – jfs

ответ

1

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

Так что это не так:

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

Это право:

SgmlLinkExtractor(allow=[r"product\.php"]) 
+0

Хорошо, спасибо. Я упростил SgmLinkExtractor, написав только одно имя: rules = (Rule (SgmlLinkExtractor (allow = ["/ aabbas"]), callback = 'parse'),) , но я все равно получаю тот же «индекс за пределами диапазона», ошибка. Что мне нужно сделать, чтобы сделать эту работу? – Zeynel

+0

если разрешить не разрешает селекторам, я могу передать ему элементы из списка? – Zeynel

+0

как SgmlLinkExtractor (allow = ["name"])? где имя «/ aabbas» – Zeynel

0

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

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

+0

Хорошо, как я ответил Пабло, я попробовал это только с одним из имен/aabbas. Но я все еще получаю ошибку индекса за пределами диапазона. Можете ли вы помочь, как мне нужно перефразировать LinkExtractor для работы. Если он работает, я могу попытаться настроить его позже. Благодарю. – Zeynel

+0

ОК, поэтому матч должен быть/aabbas. Что получает функция синтаксического анализа для этого матча? – Zeynel

0

Я также попытался поместить имена, очищенные от исходного 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 
Смежные вопросы