Python 刮痕蜘蛛索引错误
这是我一直试图在Scrapy框架内编写的Spyder1代码: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
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