XPath提供了上百个函数,用于对标签文档中的字符串、数值、日期和时间等进行计算和过滤节点集。XPath函数可以在谓词中使用,也可以在路径表达式中使用。
这里主要是学习从网页抽取内容的技术,并不是专门讲解XPath。下面列出了用于提取网页内容常用的XPath函数,更多XPath函数可参考XPath技术方面的书籍。
本节的案例文件采用2.2节的sample.html网页文件。下面列出了常用的Xpath函数。
1、函数声明:text()
若text()函数在路径表达式中使用,函数返回节点或节点集的文本内容;若text()函数在谓词中使用,用于过滤没有文本内容的节点。
案例1:返回选取节点或节点集的文本内容
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/body/*/text()")
print(select)
except IOError:
print("文件打开失败,%s文件不存在" % filename)案例2:过滤没有文本内容的节点
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/body/*[text()]")
print(select)
except IOError:print("文件打开失败,%s文件不存在" % filename)
2、函数声明:contains (string1,string2)
用于过滤节点。参数string1是属性的值,参数string2是给出的字符串。若string1包含string2,该节点被选取,否则该节点被放弃。
案例代码:
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/body/*[contains(@style,'font-weight:bolder')]/text()")
print(select)
except IOError:
print("文件打开失败,%s文件不存在" % filename)案例代码先选取body节点的子节点集,然后从选取的子节点集过滤掉节点属性style的值不包含“font-weight:bolder”内容的节点,最后返回选取节点的文本内容。
3、函数声明:starts-with(string1,string2)
用于过滤节点。参数string1是属性的值,参数string2是给出的字符串。若string1以string2开始,该节点被选取,否则该节点被放弃。
案例代码:
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/body/a[starts-with(@name,'art')]")
print(select)
except IOError:print("文件打开失败,%s文件不存在" % filename)
案例代码先选取body节点下的所有a节点,然后从选取的节点集过滤掉节点属性name的值不以“art”为开始的节点。
4、函数声明:ends-with(string1,string2)
用于过滤节点。参数string1是属性的值,参数string2是给出的字符串。若string1以string2结尾,该节点被选取,否则该节点被放弃。
案例代码参见starts-with(string1,string2)函数。
5、函数声明:not(arg)
该函数通常与contains()函数、starts-with()函数、ends-with()函数联合使用,用于对上述函数过滤的节点取反。
案例代码:
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/body/*[not(contains(@style,'font-weight:bolder'))]")
print(select)
except IOError:
print("文件打开失败,%s文件不存在" % filename)案例代码先选取body节点的子节点集,然后从选取的子节点集过滤掉节点属性style的值包含“font-weight:bolder”内容的节点。
6、函数声明:position()
该函数通过设置节点在节点集的索引范围来筛选节点,position()函数一般与关系元素符联合使用构成关系表达式,也可以通过逻辑运算符连接两个关系表达式。
案例代码:
#导入lxml库
from lxml import etree
#HTML文件路径
filename = "d://sample.html"
try:
#使用r模式打开文件,编码方式为utf-8
fp = open(filename,"r",encoding='utf-8')
content = fp.read()
#关闭文件对象
fp.close()
# 读取HTML文档内容,返回选择器
selector = etree.HTML(content)
#选取html后代所有节点且名称为title的节点
select = selector.xpath("/html/body/p[position()<=2]/text()")
print(select)
except IOError:
print("文件打开失败,%s文件不存在" % filename)案例代码先选取body节点的子节点p,然后从返回的的子节点集选取索引小于等于2的p节点,节点索引序号从1开始。