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
标记-这些标记可能是由浏览器插入的!)