题
这是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()
规则
中的正则表达式成功从起始网址中提取了我想要的所有生物网址:
>>> 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和web编程的新手,所以我不明白如何 SgmlLinkExtractor
在幕后工作。
我是否更容易尝试用Python库编写具有相同简单功能的蜘蛛?我将不胜感激任何评论和帮助。
由于
解决方案
SgmlLinkExtractor在其“允许”中不支持选择器。参数。
所以这是错误的:
SgmlLinkExtractor(allow=["hxs.select('//td[@class='altRow'] ...')"])
这是对的:
SgmlLinkExtractor(allow=[r"product\.php"])
其他提示
为SgmlLinkExtractor的每个匹配调用parse函数。
正如Pablo所说,你想简化你的SgmlLinkExtractor。
我还尝试将从初始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
不隶属于 StackOverflow