2

这是我一直试图在 Scrapy 框架中编写的 Spyder1 的代码:

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成功地从起始网址中提取了我想要的所有生物网址:

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

这是 Items.py 中的 FirmItem

from scrapy.item import Item, Field

class FirmItem(Item):
    school = Field()

    pass

你能帮我了解索引错误发生在哪里吗?

在我看来,它与SgmLinkExtractor 有关

几周以来,我一直试图让这个蜘蛛与 Scrapy 一起工作。他们有一个很好的教程,但我是 python 和网络编程的新手,所以我不明白例如如何在SgmlLinkExtractor幕后工作。

尝试使用 Python 库编写具有相同简单功能的蜘蛛会更容易吗?我将不胜感激任何评论和帮助。

谢谢

4

3 回答 3

1

SgmlLinkExtractor 在其“允许”参数中不支持选择器。

所以这是错误的:

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

这是对的:

SgmlLinkExtractor(allow=[r"product\.php"])
于 2009-11-26T20:02:09.150 回答
0

每次匹配的 SgmlLinkExtractor 都会调用 parse 函数。

正如 Pablo 提到的,您想要简化 SgmlLinkExtractor。

于 2009-11-26T20:09:07.200 回答
0

我还尝试将从初始 url 中抓取的名称放入一个列表中,然后将每个名称以绝对 url 的形式解析为http://www.whitecase.com/aabbas(对于 /aabbas)。

以下代码循环遍历列表,但我不知道如何将其传递给 parse 。你认为这是一个更好的主意吗?

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
于 2009-11-26T21:15:23.667 回答