Skip to main content
 首页 » 编程设计

python之Scrapy蜘蛛索引错误

2025年05月04日10dflying

这是我一直试图在 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 中的正则表达式成功地从起始 url 中提取了我想要的所有 bio 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 

这是 Items.py 中的 FirmItem

from scrapy.item import Item, Field 
 
class FirmItem(Item): 
    school = Field() 
 
    pass 

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

在我看来,它与SgmLinkExtractor有关。 .

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

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

谢谢

请您参考如下方法:

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

所以这是错误的:

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

这是对的:

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