Scrapy 简明教程
Scrapy - Extracting Items
Description
-
/html/head/title − 这将选择 HTML 文档的 <head> 元素内的 <title> 元素。
-
/html/head/title/text() − 这将选择同一个 <title> 元素内的文本。
-
//td − 这将选择所有来自 <td> 的元素。
-
//div[@class = "slice"] − 这将选择所有来自 div 的元素,其中包含属性 class = "slice"
选择器有四个基本的方法,如下表所示 −
Sr.No |
Method & Description |
1 |
extract() 它返回一个 unicode 字符串和选择的数据。 |
2 |
re() 返回 unicode 字符串列表,当提供正则表达式作为参数时会提取它们。 |
3 |
xpath() 返回一个选择器列表,它表示由作为参数给出的 xpath 表达式选定的节点。 |
4 |
css() 返回选择器列表,它表示由作为参数给出的 CSS 表达式选定的节点。 |
Using Selectors in the Shell
要使用内置的 Scrapy 外壳演示选择器,你需要在你的系统中安装 IPython 。这里的重要事项是,在运行 Scrapy 时,URL 应该包含在引号内;否则带有“&”字符的 URL 将不起作用。你可以使用以下命令在项目的顶级目录中启动外壳 −
scrapy shell "http://www.dmoz.org/Computers/Programming/Languages/Python/Books/"
一个外壳将如下所示 −
[ ... Scrapy log here ... ]
2014-01-23 17:11:42-0400 [scrapy] DEBUG: Crawled (200)
<GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>(referer: None)
[s] Available Scrapy objects:
[s] crawler <scrapy.crawler.Crawler object at 0x3636b50>
[s] item {}
[s] request <GET http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] response <200 http://www.dmoz.org/Computers/Programming/Languages/Python/Books/>
[s] settings <scrapy.settings.Settings object at 0x3fadc50>
[s] spider <Spider 'default' at 0x3cebf50>
[s] Useful shortcuts:
[s] shelp() Shell help (print this help)
[s] fetch(req_or_url) Fetch request (or URL) and update local objects
[s] view(response) View response in a browser
In [1]:
当外壳加载时,你可以分别使用 response.body 和 response.header 访问正文或标题。类似地,你可以使用 response.selector.xpath() 或 response.selector.css() 对响应运行查询。
例如 −
In [1]: response.xpath('//title')
Out[1]: [<Selector xpath = '//title' data = u'<title>My Book - Scrapy'>]
In [2]: response.xpath('//title').extract()
Out[2]: [u'<title>My Book - Scrapy: Index: Chapters</title>']
In [3]: response.xpath('//title/text()')
Out[3]: [<Selector xpath = '//title/text()' data = u'My Book - Scrapy: Index:'>]
In [4]: response.xpath('//title/text()').extract()
Out[4]: [u'My Book - Scrapy: Index: Chapters']
In [5]: response.xpath('//title/text()').re('(\w+):')
Out[5]: [u'Scrapy', u'Index', u'Chapters']
Extracting the Data
要从一个普通 HTML 站点中提取数据,我们必须检查该站点的源代码来获取 XPath。检查后,你会看到数据将位于 ul 标签中。选择 li 标签内的元素。
以下代码行显示了不同类型数据的提取 −
对于 li 标签中选择数据 −
response.xpath('//ul/li')
对于选择描述 −
response.xpath('//ul/li/text()').extract()
对于选择网站标题 −
response.xpath('//ul/li/a/text()').extract()
对于选择网站链接 −
response.xpath('//ul/li/a/@href').extract()
以下代码证明了上述提取器的使用 −
import scrapy
class MyprojectSpider(scrapy.Spider):
name = "project"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
for sel in response.xpath('//ul/li'):
title = sel.xpath('a/text()').extract()
link = sel.xpath('a/@href').extract()
desc = sel.xpath('text()').extract()
print title, link, desc