Scrapy 如何限制应用LinkExtractor的区域?

Scrapy 如何限制应用LinkExtractor的区域?,scrapy,Scrapy,我有一个刮板,上面有以下规则: rules = ( Rule(LinkExtractor(allow=('\S+list=\S+'))), Rule(LinkExtractor(allow=('\S+list=\S+'))), Rule(LinkExtractor(allow=('\S+view=1\S+')), callback='parse_archive'), ) 如您所见,第二条和第三条规则完全相同 我想做的是告诉斯瓦西提取的链接,我感兴趣的是指一个页面内的特定位置只。为了

我有一个刮板,上面有以下规则:

rules = (
  Rule(LinkExtractor(allow=('\S+list=\S+'))),
  Rule(LinkExtractor(allow=('\S+list=\S+'))),
  Rule(LinkExtractor(allow=('\S+view=1\S+')), callback='parse_archive'),
)
如您所见,第二条和第三条规则完全相同

我想做的是告诉斯瓦西提取的链接,我感兴趣的是指一个页面内的特定位置只。为了方便起见,我向您发送了相应的XPath,不过我更喜欢基于BeatifullSoup语法的解决方案

//*[@id="main_frame"]/tbody/tr[3]/td[2]/table/tbody/tr/td/div/table/tbody/tr/td[1]

//*[@id="main_frame"]/tbody/tr[3]/td[2]/table/tbody/tr/td/div/form/table/tbody/tr[1]

//*[@id="main_frame"]/tbody/tr[3]/td[2]/table/tbody/tr/td/div/form/table/tbody/tr[2]
编辑:

让我给你举个例子。假设我想提取Scrapy官方页面顶部的五个(共六个)链接:

这是我的蜘蛛。有什么想法吗

class dmozSpider(CrawlSpider):
    name = "dmoz"
    allowed_domains = ["scrapy.org"]
    start_urls = [
        "http://scrapy.org/",
    ]
    rules = (
        Rule(LinkExtractor(allow=('\S+/'), restrict_xpaths=('/html/body/div[1]/div/ul')), callback='first_level'),
    )
    def first_level(self, response):
        taco = dmozItem()
        taco['basic_url'] = response.url
        return taco

这可以通过
restrict\u xpath
参数完成。见

编辑:

您还可以将列表传递给
限制路径

编辑2:

应该有效的完整示例:

import scrapy
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors import LinkExtractor

class dmozItem(scrapy.Item):
    basic_url = scrapy.Field()

class dmozSpider(CrawlSpider):
    name = "dmoz"
    allowed_domains = ["scrapy.org"]
    start_urls = [
        "http://scrapy.org/",
    ]

    def clean_url(value):
        return value.replace('/../', '/')

    rules = (
        Rule(
            LinkExtractor(
                allow=('\S+/'),
                restrict_xpaths=(['.//ul[@class="navigation"]/a[1]',
                                  './/ul[@class="navigation"]/a[2]',
                                  './/ul[@class="navigation"]/a[3]',
                                  './/ul[@class="navigation"]/a[4]',
                                  './/ul[@class="navigation"]/a[5]']),
                process_value=clean_url
            ),
            callback='first_level'),
    )

    def first_level(self, response):
        taco = dmozItem()
        taco['basic_url'] = response.url
        return taco

添加了process_值以修复示例的链接。确定。因此,Scrapy.org示例非常有效!但我仍然面临着我感兴趣的网站的问题。虽然我直接从Chrome的开发工具中得到了XPath,但它似乎是错误的。您知道在Scrapy中验证XPath的快速而准确的方法吗?
Scrapy shell
可以用于此。请参阅[(文档)以获取示例。(查看您的XPath,我建议删除所有
tbody
标记-这些标记可能是由浏览器插入的!)