Scrapy SgmlLinkExtractor忽略允许的链接

时间:2009-11-28 00:34:24

标签: python web-crawler scrapy

请查看Scrapy文档中的this spider example。解释是:

  

这个蜘蛛会开始抓取example.com的主页,收集类别链接和项链接,使用parse_item方法解析后者。对于每个项目响应,将使用XPath从HTML中提取一些数据,并且将使用它填充项目。

我完全复制了同一个蜘蛛,并将“example.com”替换为另一个初始URL。

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 stb.items import StbItem

class StbSpider(CrawlSpider):
    domain_name = "stb"
    start_urls = ['http://www.stblaw.com/bios/MAlpuche.htm']

    rules = (Rule(SgmlLinkExtractor(allow=(r'/bios/.\w+\.htm', )), callback='parse', follow=True), )

    def parse(self, response):
        hxs = HtmlXPathSelector(response)

        item = StbItem()
        item['JD'] = hxs.select('//td[@class="bodycopysmall"]').re('\d\d\d\d\sJ.D.')
        return item

SPIDER = StbSpider()

但是我的蜘蛛“stb”并没有收集来自“/ bios /”的链接。它运行初始URL,擦除item['JD']并将其写入文件然后退出。

为什么忽略SgmlLinkExtractor?读取Rule是因为它会捕获Rule行内的语法错误。

这是一个错误吗?我的代码中有什么问题吗?除了我在每次运行中看到的一堆未处理错误外,没有任何错误。

在这里知道我做错了会很高兴。谢谢你的任何线索。我误解了SgmlLinkExtractor应该做什么吗?

1 个答案:

答案 0 :(得分:11)

parse函数实际上是在CrawlSpider类中实现和使用的,并且您无意中覆盖了它。如果您将名称更改为其他内容,例如parse_item,则规则应该有效。