# 链接提取器
> 译者:[OSGeo 中国](https://www.osgeo.cn/)
链接提取器是对象,其唯一目的是从网页中提取链接( [`scrapy.http.Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") 对象),最终将遵循。
有 `scrapy.linkextractors.LinkExtractor` 在Scrapy中可用,但是您可以通过实现一个简单的接口来创建自己的自定义链接提取器来满足您的需要。
每个链接提取器唯一拥有的公共方法是 `extract_links` ,接收 [`Response`](request-response.html#scrapy.http.Response "scrapy.http.Response") 对象并返回 `scrapy.link.Link` 物体。链接提取器将被实例化一次及其 `extract_links` 方法多次调用,并使用不同的响应提取要跟踪的链接。
链接提取器用于 [`CrawlSpider`](spiders.html#scrapy.spiders.CrawlSpider "scrapy.spiders.CrawlSpider") 类(在scrappy中可用),通过一组规则,但您也可以在spider中使用它,即使您不从 [`CrawlSpider`](spiders.html#scrapy.spiders.CrawlSpider "scrapy.spiders.CrawlSpider") 因为它的目的很简单:提取链接。
## 内置链接提取程序参考
在 [`scrapy.linkextractors`](#module-scrapy.linkextractors "scrapy.linkextractors: Link extractors classes") 模块。
默认的链接提取程序是 `LinkExtractor` ,与 [`LxmlLinkExtractor`](#scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor "scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor") ::
```py
from scrapy.linkextractors import LinkExtractor
```
以前的Scrapy版本中还有其他的链接提取器类,但现在已经不推荐使用了。
### LxmlLinkExtractor
```py
class scrapy.linkextractors.lxmlhtml.LxmlLinkExtractor(allow=(), deny=(), allow_domains=(), deny_domains=(), deny_extensions=None, restrict_xpaths=(), restrict_css=(), tags=('a', 'area'), attrs=('href', ), canonicalize=False, unique=True, process_value=None, strip=True)
```
LXMLlinkextractor是推荐的带有便捷过滤选项的链接提取程序。它是使用LXML的健壮的HTMLParser实现的。
| 参数: |
* **allow** (_a regular expression_ _(or_ _list of__)_) -- (绝对)URL必须匹配才能提取的单个正则表达式(或正则表达式列表)。如果没有给定(或为空),它将匹配所有链接。
* **deny** (_a regular expression_ _(or_ _list of__)_) -- (绝对)URL必须匹配的单个正则表达式(或正则表达式列表)才能排除(即不提取)。它优先于 `allow` 参数。如果未给定(或为空),则不会排除任何链接。
* **allow_domains** (_str_ _or_ _list_) -- 包含用于提取链接的域的单个值或字符串列表。
* **deny_domains** (_str_ _or_ _list_) -- 包含域的单个值或字符串列表,这些域不会被视为提取链接的域。
* **deny_extensions** (_list_) -- 包含在提取链接时应忽略的扩展名的单个值或字符串列表。如果没有给出,它将默认为 `IGNORED_EXTENSIONS` 在中定义的列表 [scrapy.linkextractors](https://github.com/scrapy/scrapy/blob/master/scrapy/linkextractors/__init__.py) 包。
* **restrict_xpaths** (_str_ _or_ _list_) -- 是一个xpath(或xpath的列表),它定义响应中应该从中提取链接的区域。如果给定,则只扫描由这些xpath选择的文本中的链接。见下面的例子。
* **restrict_css** (_str_ _or_ _list_) -- 一个CSS选择器(或选择器列表),它定义响应中应该从中提取链接的区域。行为与 `restrict_xpaths` .
* **restrict_text** (_a regular expression_ _(or_ _list of__)_) -- 链接文本必须匹配才能提取的单个正则表达式(或正则表达式列表)。如果没有给定(或为空),它将匹配所有链接。如果给出了一个正则表达式列表,那么如果链接与至少一个匹配,则将提取该链接。
* **tags** (_str_ _or_ _list_) -- 提取链接时要考虑的标记或标记列表。默认为 `('a', 'area')` .
* **attrs** (_list_) -- 在查找要提取的链接时应考虑的属性或属性列表(仅适用于在 `tags` 参数)。默认为 `('href',)`
* **canonicalize** (_boolean_) -- 规范化每个提取的URL(使用w3lib.url.canonicalize_url)。默认为 `False` . 请注意,规范化URL用于重复检查;它可以更改服务器端可见的URL,因此对于使用规范化URL和原始URL的请求,响应可能不同。如果您使用linkextractor跟踪链接,那么保持默认链接更为可靠。 `canonicalize=False` .
* **unique** (_boolean_) -- 是否对提取的链接应用重复筛选。
* **process_value** (_callable_) -- 一种函数,接收从扫描的标记和属性中提取的每个值,并能修改该值并返回一个新值,或返回 `None` 完全忽略链接。如果没有给出, `process_value` 默认为 `lambda x: x` . …highlight::html例如,要从此代码中提取链接,请执行以下操作::<a href=“javascript:gotopage('../other/page.html');return false“>link text.<a>。highlight::python您可以在 `process_value` ::def process_value(value):m=re.search(“[javascript:gotopage](javascript:gotopage)('(.*?)'”,value)如果m:返回m.group(1)
* **strip** (_boolean_) -- 是否从提取的属性中删除空白。根据HTML5标准,必须从 `href` 属性 `<a>` , `<area>` 还有许多其他元素, `src` 属性 `<img>` , `<iframe>` 元素等,因此linkextractor默认情况下会删除空格字符。集合 `strip=False` 关闭它(例如,如果从允许前导/尾随空格的元素或属性中提取URL)。
|
| --- | --- |
- 简介
- 第一步
- Scrapy at a glance
- 安装指南
- Scrapy 教程
- 实例
- 基本概念
- 命令行工具
- Spider
- 选择器
- 项目
- 项目加载器
- Scrapy shell
- 项目管道
- Feed 导出
- 请求和响应
- 链接提取器
- 设置
- 例外情况
- 内置服务
- Logging
- 统计数据集合
- 发送电子邮件
- 远程登录控制台
- Web服务
- 解决具体问题
- 常见问题
- 调试spiders
- Spider 合约
- 常用做法
- 通用爬虫
- 使用浏览器的开发人员工具进行抓取
- 调试内存泄漏
- 下载和处理文件和图像
- 部署 Spider
- AutoThrottle 扩展
- Benchmarking
- 作业:暂停和恢复爬行
- 延伸 Scrapy
- 体系结构概述
- 下载器中间件
- Spider 中间件
- 扩展
- 核心API
- 信号
- 条目导出器
- 其余所有
- 发行说明
- 为 Scrapy 贡献
- 版本控制和API稳定性