从HTML源文件库中解析数据通常有以下常用的库可以使用:
- BeautifulSoup是在程序员间非常流行的网页分析库,它基于HTML代码的结构来构造一个Python对象, 对不良标记的处理也非常合理,但它有一个缺点:慢。
- lxml是一个基于 ElementTree (不是Python标准库的一部分)的python化的XML解析库(也可以解析HTML)。
Scrapy提取数据有自己的一套机制。它们被称作选择器(seletors),因为他们通过特定的 XPath 或者 CSS 表达式来“选择” HTML文件中的某个部分。XPath 是一门用来在XML文件中选择节点的语言,也可以用在HTML上。 CSS 是一门将HTML文档样式化的语言。选择器由它定义,并与特定的HTML元素的样式相关连。
Scrapy选择器构建于 lxml 库之上,这意味着它们在速度和解析准确性上非常相似。不同于 lxml API的臃肿,该API短小而简洁。这是因为 lxml 库除了用来选择标记化文档外,还可以用到许多任务上。
1. Using selectors
1.1 Constructing selectors
Scrapy selectors是Selector
类的实例,通过传入text或TextResponse
来创建,它自动根据传入的类型选择解析规则(XML or HTML):
from scrapy.selecor import Selector
from scrapy.http import HtmlResponse
从text构建:
body = '<html><body><span>good</span></body></html>'
Selector(text=body).xpath('//span/text()').extract()
从response构建:
response = HtmlResponse(url='http://example.com', body=body)
Selector(response=response).xpath('//span/text()').extract()
response对象以 .selector 属性提供了一个selector, 您可以随时使用该快捷方法:
response.selector.xpath('//span/text()').extract()
1.2 Using selectors
以下面的文档来解释如何使用选择器:
<html>
<head>
<base href='http://example.com/' />
<title>Example website</title>
</head>
<body>
<div id='images'>
<a href='image1.html'>Name: My image 1 <br /><img src='image1_thumb.jpg' /></a>
<a href='image2.html'>Name: My image 2 <br /><img src='image2_thumb.jpg' /></a>
<a href='image3.html'>Name: My image 3 <br /><img src='image3_thumb.jpg' /></a>
<a href='image4.html'>Name: My image 4 <br /><img src='image4_thumb.jpg' />