数据提取
数据提取
通过之前的学习,我们已经可以通过多种方式获取到数据了,可能是直接可以使用的 HTML,也可能是 JS、CSS 代码、多媒体资源等。
接着我们需要从中提取出对我们有价值的数据,这一步是文本预处理 。提取的方式有根据网页节点结构、JS 语法、标签属性、纯文本规律等。
正则表达式:根据文字规律,解析最快(不同语言的正则表达式语法略有不同,Python 的正则表达式主要通过 re 模块实现)
Xpath:根据网页节点路径,解析较快
CSS:根据网页的 css 项,可读性更强
Beatifulsoup:根据属性、节点、css ,解析最慢
parsel:根据正则、网页节点路径、属性、节点、css 提取,解析较快
当然,除了对数据除了藏在网页之中,也有可能藏在 json 中。
execjs:兼容性最好,并且支持转换后执行 js,但是速度较慢。
Xpath
Xpath 的基本语法
更多实例可以查看菜鸟教程的Xpath 实例
表达式 | 描述 |
---|---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取(取子节点) |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点) |
. | 选取当前节点 |
.. | 选取当前节点的父节点 |
@ | 选取属性 |
* | 匹配任何元素节点 |
@* | 匹配任何属性节点 |
node() | 匹配任何类型的节点 |
/bookstore/* | 选取 bookstore 元素的所有子元素 |
//* | 选取文档中的所有元素 |
//title[@*] | 选取所有带有属性的 title 元素 |
text() | 提取文本信息 |
下面是一些具体的例子,另外 通过在路径表达式中使用"|"运算符,您可以选取若干个路径。譬如:
//title | //price 选取文档中的所有 title 和 price 元素。
表达式 | 描述 |
---|---|
/bookstore/book[1] | 选取属于 bookstore 子元素的第一个 book 元素 |
/bookstore/book[last()] | 选取属于 bookstore 子元素的最后一个 book 元素 |
/bookstore/book[last()-1] | 选取属于 bookstore 子元素的倒数第二个 book 元素 |
/bookstore/book[position()< 3] | 选取最前面的两个属于 bookstore 元素的子元素的 book 元素 |
//title[@lang] | 选取所有拥有名为 lang 的属性的 title 元素 |
//title[@lang='eng'] | 选取所有 title 元素,且这些元 素拥有值为 eng 的 lang 属性 |
/bookstore/book[price>35.00] | 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00 |
/bookstore/book[price>35.00]//title | 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00 |
CSS
CSS 的基本语法
更多实例可以查看CSS 选择器参考手册
选择器 | 例子 | 例子描述 |
---|---|---|
.class | .intro | 选择 class="intro" 的所有元素 |
.class1.class2 | .name1.name2 | 选择 class 属性中同时有 name1 和 name2 的所有元素 |
.class1 .class2 | .name1 .name2 | 选择作为类名 name1 元素后代的所有类名 name2 元素 |
#id | #firstname | 选择 id="firstname" 的元素 |
* | * | 选择所有元素 |
element | p | 选择所有 p 元素 |
element.class | p.intro | 选择 class="intro" 的所有 p 元素 |
element,element | div, p | 选择所有 div 元素和所有 p 元素 |
element element | div p | 选择 div 元素内的所有 p 元素 |
element>element | div > p | 选择父元素是 div 的所有 p 元素 |
element+element | div + p | 选择紧跟 div 元素的首个 p 元素 |
element1~element2 | p ~ ul | 选择前面有 p 元素的每个 ul 元素 |
[attribute] | [target] |