LXML

  • 教程:
  • 元素树:
  • lxml.etree:
  • lxml.objectify:
    • lxml.objectify API 文档
    • objectify 和 etree的简单比较

      xpath

      etree中的xpath解析模块

      常用xpath表达式

      属性定位
      1. #找到class属性值为song的div标签
      2. //div[@class="song"]
      层级&索引定位
      1. #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
      2. //div[@class="tang"]/ul/li[2]/a
      逻辑运算
      1. #找到href属性值为空且class属性值为du的a标签
      2. //a[@href="" and @class="du"]
      模糊匹配
      1. //div[contains(@class, "ng")]
      2. //div[starts-with(@class, "ta")]
      取文本
      1. # /表示获取某个标签下的文本内容
      2. # //表示获取某个标签下的文本内容和所有子标签下的文本内容
      3. //div[@class="song"]/p[1]/text()
      4. //div[@class="tang"]//text()
      取属性
      1. //div[@class="tang"]//li[2]/a/@href

      etree对象实例化

      本地文件

      1. tree = etree.parse(文件名)

      网络数据

      1. tree = etree.HTML(网页内容字符串)

      技术文章参考

      董小贱 - Xpath高级使用方法

      匹配当前节点下的所有:.//

      1. . 表示当前
      2. // 表示当前标签下的所有标签
      3. 注: 要配合使用

      匹配某标签的属性值: /@属性名称

      1. 这里以input里的value值为例:
      2. 例:xpath(//input/@value)

      匹配多个路径:|

      1. 在一个xpath中写的多个表达式用 | 分开, 每个表达式互不干扰。
      2. 例:xpath("//tr[6]/td[2]/text() | //tr[7]/td[2]/text()")

      按属性匹配:@

      1. 获取所有id="test"的所有文本内容
      2. xpath('//*[@id="test"]//text()')

      匹配不包含某个属性的标签 not

      1. 多用于表格中匹配中不包含表头信息的数据
      2. 例:xpath('//table/tr[not(@class="tbhead")]')

      匹配包含多个属性的标签:and

      1. 匹配所有的tr中不包含 tbhead 属性 和包含 head 的tr标签
      2. xpath('//table/tr[not(@class="tbhead") and @class="head"]')

      匹配包含不同属性的名称相同的标签:or

      1. 匹配包含class="speedbar" 或者 class="content-wrap" 的标签
      2. 例:xpath('//div[@class="speedbar" or @class="content-wrap"]')

      将对象还原为字符串:etree.tostring()

      ```xml 将匹配到的对象,作为etree.tostring()的参数即可, 注: 返回字符串

sObj = xml.xpath(‘//*[@id=”test”]’)[0] #使用xpath定位一个节点 sStr = etree.tostring(sObj)

  1. <a name="MgKkP"></a>
  2. ### 按轴(Axes)匹配
  3. <a name="Emzby"></a>
  4. #### 选取当前节点的所有子元素:`child`
  5. ```xml
  6. 获取div下的tr的标签
  7. 例:xpath('//div[@id="testid"]/child::tr/td/text()') # 感觉这种方法鸡肋, //div[@id="testid"]//tr/td 也可以实现

选取当前节点的所有属性:attribute

  1. 获取div标签所有的属性值
  2. 例: xpath('//div/attribute::') # 感觉这种方法鸡肋,//div/@ 同样能实现

ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素

  1. 获取父辈元素的div的所有属性值, 在不好定位的情况下,通过孩子标签定位,这种方法可以用
  2. xpath('//div[@id="test"]/ancestor::div/@*')
  3. xpath('//div[@id="test"]/ancestor-or-self::div/@*')

descendant:后代 / descendant-or-self:后代及当前节点本身

  1. 获取孩子元素的div的所有属性值,感觉鸡肋
  2. xpath('//div[@id="test"]/descendant::div/@*')
  3. xpath('//div[@id="test"]/descendant-or-self::div/@*')

选取当前节点的所有命名空间节点:namespace

  1. xpath('//div[@id="test"]/namespace::*')

定位:position

  1. 和通过下标定位一样, 方法鸡肋
  2. xpath('//*[@id="test"]/ol/li[position()=2]/text()')

Xpath 函数

统计数量:count

  1. 统计符合要求节点的数量, 注: 返回字符串
  2. xpath('count(//tr[@info])')

字符串拼接 :concat

  1. 统计出来的两个内容的字符串进行“ + ”处理, 注: 返回字符串
  2. xpath('concat(//li[@id="one"]/text(),//li[@id="three"]/text())')

解析当前节点下的字符:string

  1. string()直解析匹配的第一个标签的值, 注: 返回字符串
  2. xpath('string(//tr)')

获取当前节点的节点名称:local-name

  1. 返回当前属性的节点名称, 注: 返回字符串
  2. xpath('local-name(//*[@id="test"])')

以指定的字符开头:starts-with

  1. starts-with定位属性值以8开头的li元素
  2. xpath('//tr[starts-with(@code,"one")]/text()')

小于:<

  1. 匹配所有tr标签属性info小于200的内容
  2. xpath('//tr[@info<200]/text()')

根据指定的文本内容选择

  1. 指定的文本内容可以是文本内容的部分, 也可以是全部
  2. //div[2]/ul/li[contains(text(), "指定的文本内容")]/span/text()
  3. 注: 以上内容, 除标注外, 均返回列表!!