Python 刮痕蜘蛛索引错误

Python 刮痕蜘蛛索引错误,python,web-crawler,scrapy,Python,Web Crawler,Scrapy,这是我一直试图在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 Fir

这是我一直试图在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()
但是当我运行代码时,我得到

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

[Failure instance: Traceback: <type 'exceptions.IndexError'>: list index out of range
你能帮我理解索引错误发生在哪里吗

在我看来,这似乎与我有关

几周来,我一直在努力让这只蜘蛛和Scrapy一起工作。他们有一个很好的教程,但我对python和web编程还不熟悉,所以我不明白例如
SgmlLinkExtractor
在幕后是如何工作的

对我来说,用Python库编写具有相同简单功能的spider会更容易吗?如果您有任何意见和帮助,我将不胜感激


谢谢,SGMLLinkedExtractor在其“允许”参数中不支持选择器

所以这是错误的:

SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
这是正确的:

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

将为SgmlLinkExtractor的每个匹配项调用parse函数


正如Pablo提到的,您希望简化SGMLLinkedExtractor。

我还尝试将从初始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

我认为它根本不在LinkedExtractor中;在我看来,这似乎与parse方法有关,它搜索学位所在的学校。然后我想,我需要添加一个for循环来解析,以便它在LinkExtractor返回的每个URL中查找JD?但我并不真正理解LinkedExtractor和parse之间的关系。这里的教程在parse中有for循环,但它使用嵌套的hx。我不清楚如何在我只有1个正则表达式的情况下实现这一点。始终对可能包含正则表达式的字符串使用原始字符串文字,例如,而不是“\w+”使用r“\w+”。我将r放在引号之前。它是否必须转到\w+rules=(Rule(SgmlLinkExtractor(allow=[r/.a\w+“])、callback='parse')旁边,好的,谢谢。我简化了SgmLinkExtractor,只编写了一个名称:rules=(Rule(SgmlLinkExtractor(allow=[“/aabbas”]),callback='parse')),但仍然得到相同的“索引超出范围”错误。我需要做什么才能让它工作?如果allow不允许选择器,我可以将列表中的项目传递给它吗?比如SGMLLinkedExtractor(allow=[“name”])?其中名称为“/aabbas”好的,当我回答Pablo时,我只使用其中一个名称/aabbas进行了尝试。但我仍然得到了索引超出范围的错误。你能帮我重新表述LinkedExtractor的工作方式吗。如果它起作用的话,我以后可能会尝试对它进行微调。谢谢。好的,比赛应该是/aabbas。解析函数为这个匹配得到什么?
SgmlLinkExtractor(allow=[r"product\.php"])
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