Logo

郎哥编程

XPath函数

2020-08-25 210

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开始。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论