如何使用xpath表达式解析HTML和XML文档

html-css010

如何使用xpath表达式解析HTML和XML文档,第1张

看下面一些例子:

1)获取子节点:getchildren()等价于child::*

>>>doc.getchildren()

2)获取当前节点:"."等价于self::node()

>>>doc.xpath(".")

>>>doc.xpath("self::node()")

3)获取父节点:".."等价于parent::node()

>>>doc.head.xpath("..")

>>>doc.head.xpath("parent::node()")

4)ancestor轴和descendant轴

分别代表当前元素所有祖先元素、所有后代元素,比如:

>>>meta.xpath('ancestor::*')

>>>meta.xpath('ancestor::head')

>>>doc.xpath('descendant::table')

>>>doc.xpath('descendant::table[@id="tcdatafields"]')

>>>doc.xpath('//table[@id="tcdatafields"]')

5)ancestor-or-self和descendant-or-self轴

分别表示当前元素或其所有祖先元素、当前元素或其所有后代元素,比如:

>>>meta.xpath('ancestor-or-self::*')

,,]

6)child和parent轴

分别表示当前元素所有子元素、父元素:

>>>doc.xpath('child::head')

>>>head.xpath('child::meta[1]')

>>>head.xpath('child::meta[position()<3]')

7)attribute轴

表示当前元素的所有属性,例如下面是meta元素的name和content两个属性以及取值:

>>>meta.items()

[('name','googlebot'),('content','index,follow')]

获取所有属性取值:

>>>meta.xpath('attribute::*')

['googlebot','index,follow']

获取name属性的取值:

>>>meta.xpath('attribute::name')

['googlebot']

8)following和preceding

分别表示当前元素的所有后继元素、前置元素,比如:

>>>meta.xpath('following::*')

>>>meta.xpath('preceding::*')

9)following-sibling和preceding-sibling轴

分别表示当前元素的所有平级后继元素、平级前置元素,比如:

>>>meta.xpath('preceding-sibling::*')

>>>meta.xpath('following-sibling::*')

10)self轴

表示当前元素自身

>>>doc.xpath("self::*")

使用谓词(predicates)

谓词就是step中使用中括号[...]定义的那部分,使用谓词能实现精确查找,看下面的例子:

>>>doc.xpath('/html/head/meta')

,,,,,,]

1)位置谓词

>>>doc.xpath('/html/head/meta[1]')

>>>doc.xpath('/html/head/meta[2]')

>>>doc.xpath('/html/head/meta[last()]')

>>>doc.xpath('/html/head/meta[last()-1]')

>>>doc.xpath('/html/head/meta[position()<3]')

注:这里使用了last()和position()两个函数,xpath还支持更多的函数,结合这些函数可以获得非常强大的处理能力。

2)属性谓词

含有属性name的meta元素:

>>>doc.xpath('/html/head/meta[@name]')

,,,]

含有属性name而且其取值为robots的meta元素:

含有任意属性的meta元素:

>>>doc.xpath('/html/head/meta[@*]')

3)函数谓词

xpath内置很多函数,灵活使用这些函数,可以极大提升查找效率,比如:

-使用text()函数

>>>doc.xpath('//td[text()="2017-03-21"]')

-使用contains函数

>>>[td.textfortdindoc.xpath('//td[contains(text(),"2017-03-2")]')]

['2017-03-29','2017-03-28','2017-03-27','2017-03-24','2017-03-23','2017-03-22','2017-03-21','2017-03-20']

-使用starts-with函数

>>>[td.textfortdindoc.xpath('//td[starts-with(text(),"2017-02-2")]')]

['2017-02-28','2017-02-27','2017-02-24','2017-02-23','2017-02-22','2017-02-21','2017-02-20']

>>>[td.textfortdindoc.xpath('//td[text()>21.0andtext()<23.0]')]

['21.02']

>>>[td.textfortdindoc.xpath('//td[text()<-2.5ortext()>21.0]')]

['21.02','-2.64']

通配符

xpath也支持通配符"*",其中'*"可以匹配任何标签元素,"@*"可以匹配任何元素属性,node()可以匹配任何节点:

>>>head.xpath('./*')

,,,,,,,,,]

>>>head.xpath('./meta[@*]')

>>>head.xpath('./node()')

html(Hypertext Markup Language):

超文本标记语言,网页中的基本元素,是用于描述网页文档的一种标记语言。

XML(Extensible Markup Language):

即可扩展标记语言,它与HTML一样都是一种标记语言,只不过这个可以自定义,功能强,更灵活。

http(HTTP,HyperText Transfer Protocol):

超文本传输协议,是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。

SOAP:

简单对象访问协议,简单对象访问协议(SOAP)是一种轻量的、简单的、基于 XML 的协议,它被设计成在 WEB 上交换结构化的和固化的信息。 SOAP 可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议( HTTP),简单邮件传输协议(SMTP),多用途网际邮件扩充协议(MIME)。它还支持从消息系统到远程过程调用(RPC)等大量的应用程序。

XSLT(Extensible Stylesheet Language Transformations):

扩展样式表转换语言的简称,这是一种对XML文档进行转化的语言,XSLT中的T代表英语中的“转换”(transformation)。

XPath:

是一门在 XML 文档中查找信息的语言。XPath 用于在 XML 文档中通过元素和属性进行导航。