[关闭]
@nemos 2017-05-06T02:02:21.000000Z 字数 2051 阅读 792

xpath

py


Xpath语法

示例XML

  1. <bookstore>
  2. <book>
  3. <title>Harry Potter</title>
  4. <author>J K. Rowling</author>
  5. <year>2005</year>
  6. <price>29.99</price>
  7. </book>
  8. </bookstore>

节点关系

  1. 父(parent)
    • 每个元素及属性都有一个父
    • book是title的父
  2. 子(children)
    • 元素节点可以有零,一或多个子
    • title是book的子、
  3. 同胞(sibling)
    • 拥有相同父元素的节点
    • title与auther互为同胞关系
  4. 先辈(ancestor)
    • 某节点的父,父的父等等
    • bookstore是book与title的先辈
  5. 后代(descendant)
    • 某个节点的子,子的子等等
    • book和title都是bookstore的后代

节点选取

路径表达式

  1. - 表达式 = 描述
  2. - nodename = 选取此节点所有的子节点
  3. - / = 从根节点开始选取
  4. - // = 选取此节点下所有节点不考虑其相对位置
  5. - . = 选取当前节点
  6. - .. = 选取当前节点的父节点
  7. - @ = 选取属性

实例

  1. - 路径表达式 = 结果
  2. - bookstore = 选取bookstore元素所有子节点
  3. - /bookstore = 选取元素bookstore
  4. - / = 由/开始始终表示绝对路径
  5. - bookstore/book = 选取属于bookstore节点的所有book元素
  6. - //book = 选取所有book元素不管他们在文档中位置
  7. - bookstore//book = 选取所有属于bookstore元素的后代元素,不管他们在bookstore下的什么位置
  8. - //@lang = 选取名为lang的所有属性

谓语

  1. - 查找某个特定节点或包含某个特定值的节点
  2. - 谓语被嵌在方括号中
  3. * 路径表达式 = 结果
  4. * /bookstore/book[1] = 选取bookstore下的第一个book元素
  5. * /bookstore/book[last()] = 选取bookstore下的最后一个book元素
  6. * /bookstore/book[last()-1] = 选取bookstore下的倒数第二个book元素
  7. * /bookstore/book[position()<3] = 选取bookstore下的前前两个book元素
  8. * //title[@lang] = 选取所有拥有lang属性的title元素
  9. * //title[@lang ='eng'] = 选取所有拥有title属性且值为eng的title元素
  10. * bookstore/book[price>10.00]/title = 不解释

节点匹配

  1. - 通配符 = 描述
  2. - '*' = 匹配任何元素节点
  3. - @* = 匹配任何属性节点
  4. - node() = 匹配任何类型的节点
  5. - | = 选取若干路径

实例

  1. - 表达式 = 结果
  2. - //title[@*] = 选取所有带属性的title元素
  3. - //title | //price = 选取所有title和price元素

运算符

lxml的用法

实例HTML

  1. <div>
  2. <ul>
  3. <li class="item-0"><a href="link1.html">first item</a></li>
  4. <li class="item-1"><a href="link2.html">second item</a></li>
  5. <li class="item-inactive"><a href="link3.html">third item</a></li>
  6. <li class="item-1"><a href="link4.html">fourth item</a></li>
  7. <li class="item-0"><a href="link5.html">fifth item</a>
  8. </ul>
  9. </div>

初步

  1. from lxml import etree
  2. html = etree.HTML(text) #初始化html对象并优化
  3. html = etree.parse(file.txt) #从文件中初始化html对象
  4. result = etree.tostring(html) #转换字符串

实例测试

获得标签

  1. lxml.etree._ElementTree = etree.HTML(text)
  2. resultlist = lxml.etree._ElementTree.xpath('//li')
  3. type(resultlist[0]) = lxml.etree._Element

获得属性的值

  1. valuelist = html.xpath('//li/@class') #获得所有li标签的class属性的值
  2. lxml.etree._Element = html.xpath('//li/a[@href="link1.html"]') #获得特定值得a标签
  3. lxml.etree._Element = html.xpath('//*[@class="bold"]') #获得所有class属性值为bold的元素

获得内容

  1. lxml.etree._Element.tag #获得标签名
  2. lxml.etree._Element.text #获得元素内容
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注