一. XPATH
1. 什么是xpath?
xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历。
2. 常用的xpath开发工具
(1) Chrome插件XPath Helper(推荐使用)。
(2) Firefox插件Try XPath。
3. xpath语法(核心)
(1) 选取节点:XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。
表达式描述示例结果nodename选取此节点的所有子节点bookstore选取bookstore下所有的子节点/如果是在最前面,代表从根节点选取。否则选择某节点下的某个节点/bookstore选取根元素下所有的bookstore节点//从全局节点中选择节点,随便在哪个位置//book从全局节点中找到所有的book节点@选取某个节点的属性//book[@price]选择所有拥有price属性的book节点.当前节点./a选取当前节点下的a标签(2) 谓语:谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号中。
路径表达式描述/bookstore/book[1]选取bookstore下的第一个子元素/bookstore/book[last()-1]选取bookstore下的倒数第二个book元素。bookstore/book[position()<3]选取bookstore下前面两个子元素。//book[@price]选取拥有price属性的book元素//book[@price=10]选取所有属性price等于10的book元素(3) 通配符 *
通配符描述示例结果*匹配任意节点/bookstore/*选取bookstore下的所有子元素。@*匹配节点中的任何属性//book[@*]选取所有带有属性的book元素。(4) 选取多个路径 |:通过在路径表达式中使用“|”运算符,可以选取若干个路径。
//bookstore/book | //book/title # 选取所有book元素以及book元素下所有的title元素
(5) string()提取某标签下及其所有子孙节点中的文本(重要)
1.响应文本内容: <div class="text"> 哈哈哈哈哈哈 <ul class="show"> <li>275万购昌平邻铁三居 总价20万买一居</li> <li>00万内购五环三居 140万安家东三环</li> <li>北京首现零首付楼盘 53万购东5环50平</li> <li>京楼盘直降5000 中信府 公园楼王现房</li> 哈哈哈哈哈哈哈 </ul> </div> 2.提取该标签下以及其所有子孙节点下的文本 >>> from lxml import etree ... >>> result = html.xpath(" string(//div[@class='text']) ") '哈哈哈哈哈哈 275万购昌平邻铁三居 总价20万买一居 00万内购五 环三居 140万安家东三环 北京首现零首付楼盘 53万购东5环50平 京楼盘直降5000 中信府 公园楼王现房 哈哈哈哈哈哈 '二. LXML库
1. 什么是lxml?
lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。
lxml python 官方文档:http://lxml.de/index.html
需要安装C语言库,可使用 pip 安装:pip install lxml
2. lxml和xpath的结合使用(注意parse函数和HTML函数的用法)
(1) 从外部文件引入html等文档进行解析
from lxml import etree # parse引入外部文档进行解析 html = etree.parse('hello.html') print type(html) # 显示etree.parse() 返回类型 result = html.xpath('//li') print(result) # 打印<li>标签的元素集合(2) 直接对字符串进行解析(爬虫常用)
# 这里只是打个样,具体的参数填入还需看个人需求 from lxml import etree # html_str是unicode类型的字符串,通常是爬取下来的text类型数据 html = etree.HTML(html_str) # 根据得到的html对象 调用 xpath语法 进行解析 div_list = html.xpath("//div[@class='col1 old-style-col1']/div")