1. xpath简介
- xpath使用路径表达式在xml和html中进行导航,可用来在html和xml文档中对元素和属性进行遍历。
- xpath包含标准函数库
- xpath是一个w3c的标准
2. 基础术语极其解释
-
xpath有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。
- 元素: 被<>包住的节点称之为元素
- 属性: 元素中id='bk104', xxx称之为属性
-
操作符或表达式
操作符或表达式 含义 / 从根节点开始查找 // 从当前节点开始任意层内查找 . 当前节点 .. 当前节点的父节点 @ 选择属性 节点名 在html节点下选取所有这个节点名的节点 * 匹配任意元素节点 @* 匹配任意属性的节点 node() 匹配任意类型的节点 text() 匹配text类型的节点 -
xpath轴(Axes)
轴名称 结果 ancestor 选取当前节点的所有先辈(父、祖父等) ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身 attribute 选取当前节点的所有属性。@id 等价于 attribute::id child 选取当前节点的所有子元素。title 等价于 child:title descendant 选取当前节点的所有后代元素(子、孙等) descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身 following 选取文档中当前节点的结束标签之后的所有节点 namespace 选取当前节点的所有命名空间节点 parent 选取当前节点的父节点 preceding 直到所有这个节点的父辈节点,顺序选择每个父辈节点前的所有同级节点 preceding-sibling 选取当前节点之前的所有同级节点 self 选取当前节点。 . 等价于 self::node() 3.xpath常用实例
以/开始是绝对路径,表示从根开始
不以/开始是相对路径,一般动当前节点来计算.当前节点在上下文环境中,不一定是根目录.
一般如果搜索层次很深,推荐使用//来查找路径表达式 含义 title 选取当前节点下的所有title子节点 /book 从根节点找子节点是book的,一般找不到,根节点下只有html book/title 当前节点下的所有book子节点下的title节点 //title 从根节点向下找任意层中的title节点 book//title 当前节点下的book节点下的任何层中找titles //@name 任意层下查找name属性,取回的是属性而不是节点 //book[@id] 任意层中寻找有id属性的book节点 //book[@id='bk104'] 任意层中寻找id属性为bk101的book节点 /bookstore/book[1]/@id 根节点bookstore下第一个book节点的id属性 /bookstore/book[last()-1] 根节点bookstore下的倒数第二个book节点 /bookstore/* 根节点bookstore下的所有子节点,不递归 //* 匹配所有节点 //[@] 匹配所有有属性的节点 //book[@*] 匹配所有有属性的book节点 //@* 匹配所有属性 //book/title` `//price 匹配所有book下的title节点或者任意层下的price节点 //book[position()=2] 匹配所有book节点中的第二个 //book[position()<last()-1] 匹配所有book节点中位置小于倒数第二个的 //book[price>40] 匹配其下的price节点值大于40的book节点 //book[2]/node() 匹配第二个book节点下的所有类型的节点 //book[1]/text() 匹配第一个book节点下的所有的文本 //book[1]//text() 匹配第一个book节点下的任意层的子节点的文本 //*[local-name()='book'] 匹配所有不戴限定名节点名称为book的所有节点 4.配合lxml使用xpath
lxml是Python功能丰富的xml,html解析库,性能非常好,是对libxml2和libxslt的封装
centos编译安装需要依赖libxml2-devel和libxslt-devel
不同平台请参考http://lxml.de/installation.html
安装:
pip install lxml
简单使用方法:from lxml impot etree import requests response = requests.get(url, headers={'User-agent':ua}) content = response.text html = etree.HTML(content) titles = html.xpath('//div[@id='bk104']//tr//td/text()') # 返回文本列表
5. 在scrapy中使用xpath
直接使用response.xpath('//div[@id="bk104"]')返回的是一个scrapy的selector对象,可以进一步调用xpath继续选择.
瑞国要返回doom节点元素,可以调用extract()返回的是一个列表.
如果只需要列表的第一个或者列表长度本身为1,可以用extract_first()