当前位置:首页 > 后端开发 > 正文内容

Xpath解析及其语法

邻居的猫1个月前 (12-09)后端开发1893

XPath解析

XPath(XML Path Language)是一种用于在XML和HTML文档中查找信息的言语,其经过途径表达式来定位节点,特点和文本内容,并支撑杂乱查询条件,XPath 是许多 Web 抓取东西如 Scrapy,Selenium 等的核心技术之一

XPath 解析的根本过程

  1. 导入lxml.etree

    from lxml import etree
    
  2. 运用etree.parse(filename, parser=None)函数回来一个树形结构

    • etree.parse()用于解析本地XML或HTML文件,并将其转换为一个树形结构即ElementTree目标,能够经过该目标拜访文档的各个节点
    • filename:要解析的文件途径
    • parser(可选):默许情况下,parser()会依据文件扩展名主动挑选适宜的解析器,如.xml文件运用XML解析器,.html运用HTML解析器
  3. 运用etree.HTML(html_string, parser=None)解析网络html字符串

    • html_string :要解析的HTML字符串
    • parser:(可选):默许情况下etree.HTML()运用etree.HTMLparser()进行解析
    • 回来值:etree.HTML()回来一个ELement目标,表明HTML文档的根元素,能够经过该目标拜访文档各个节点
  4. 运用.xpath(xpath_expression)在现已解析好的HTML文档中履行XPath查询

    result = html_tree.xpath(xpath_expression)
    
    • xpath_expression:XPath表达式,用于在文档中查找节点,XPath表达式能够是绝对途径或相对途径,也能够包含谓词,函数和轴操作,首要的XPath语法下面会议开解说
    • html_tree:能够是 ElementTree 目标(由 etree.parse() 回来)或 Element 目标(由 etree.HTML() 回来)
from lxml import etree

# 运用etree.parser()解析文件途径
parser = etree.HTMLParser(encoding='utf-8')  # 以utf8进行编码
tree = etree.parse('../Learning02/三国演义.html', parser=parser)
print(tree)
#output-> <lxml.etree._ElementTree object at 0x000001A240107000>

# 运用etree.HTML()解析本地文件或网络动态HTML
# 读取文件 解析为字符串
file = open('../Learning02/三国演义.html', 'r', encoding='utf-8')
data = file.read()
root = etree.HTML(data)
print(root)

#整合
root = etree.HTML(open('../Learning02/三国演义.html', 'r', encoding='utf-8').read())
print(root)
#output-> <Element html at 0x1a23e462880>

XPath语法

XPath语法能够用于在XML与HTML文档中查找信息的言语

途径表达式

XPath运用途径表达式来定位文档中的节点,途径也能够分为绝对途径与相对途径

绝对途径

  • /:表明从根节点开端挑选,其用于界说一个绝对途径

从根节点html开端查找到head,再从head下找出title标签

root = etree.HTML(open('../Learning02/三国演义.html', 'r', encoding='utf-8').read())
all_titles = root.xpath('/html/head/title')
for title in all_titles:
    print(etree.tostring(title, encoding='utf-8').decode('utf-8'))
#output-> <title>《三国演义》全集在线阅览_史书典籍_诗词名句网</title>

相对途径

比较与绝对途径,相对途径运用率更好,更好用

  • //:表明从当时节点开端,挑选文档中一切契合条件的节点,而且不考虑他们的方位
root = etree.HTML(open('../Learning02/三国演义.html', 'r', encoding='utf-8').read())
all_a = root.xpath('//a')
for a in all_a:
    print(a.text)
#None
#主页
#分类
#作者
#...

当时节点

  • ./:表明当时节点,一般用于指明当时节点自身,防止混杂
all_a = root.xpath('//a')
print(all_a[1].xpath('./text()')) #./表明当时的a标签
#output-> ['主页']

挑选特点

  • @:用于挑选元素的特点,而不是元素自身
# 运用 @ 挑选 <a> 标签的 href 特点
all_hrefs = root.xpath('//a[@href]')
for hrefs in all_hrefs:
    print(etree.tostring(hrefs, encoding='unicode'))

XPath谓语

谓语是xpath中用于进一步挑选节点的表达式,一般放在方括号[] 内,其能够依据节点的方位,特点值,文本内容或其他条件来挑选特定的节点,谓语能够嵌套运用,也能够与其他谓语组合运用

  • 根本语法

    //element[condition]
    
    • element:要挑选的元素
    • condition:谓语中的条件,用于进一步挑选契合条件的元素

方位谓语

方位谓语用于依据节点在兄弟节点中的方位进行挑选,能够运用position()或直接指定方位编号

  • 获取第一个ul标签中的第一个li标签

    #//ul获取的是一切ul,[0]挑选第一个
    lis = root.xpath('//ul')[0].xpath('./li[1]')
    for li in lis:
        print(etree.tostring(li, encoding='unicode'))
    #output-> <li><a href="/">主页</a></li>
    
  • 运用last()获取最终第一个节点,和导数第二个节点

    # 倒一个
    last_li = root.xpath('//ul')[0].xpath('./li[last()]')
    print(etree.tostring(last_li[0], encoding='unicode'))
    # 倒二个
    last_second_li = root.xpath('//ul')[0].xpath('./li[last()-1]')
    print(etree.tostring(last_second_li[0], encoding='unicode'))
    #output-> <li><a href="/app/">安卓下载</a></li>
    #<li><a href="/book/">古籍</a></li>
    
  • 运用position()获取方位进行挑选

    # 获取前两个li标签
    last_li = root.xpath('//ul')[0].xpath('./li[position()<3]')
    for li in last_li:
        print(etree.tostring(li, encoding='unicode'))
    # 获取偶数位标签
    lis = root.xpath('//ul')[0].xpath('./li[position() mod 2=0]')
    for li in lis:
        print(etree.tostring(li, encoding='unicode'))
    
  • 特点谓语

    特点谓语用于挑选详细特定特点的节点

    • 运用@attribute来获取特点称号,结合条件进行挑选
    # 选取一切具有 href 特点的 a 元素
    hrefs = root.xpath("//a[@href]")
    for href in hrefs:
        print(etree.tostring(href, encoding='unicode'))
    
    • 查找class特点值
    all_class = root.xpath('//@class')
    print(all_class)
    
  • 组合谓语

    将多个条件组合在一起,运用逻辑运算符 and,or等来创立更杂乱的谓语

    #选取href特点值为https://example.com且class特点值为link的a元素
    //a[@href='https://example.com' and @class='link']
    
    #选取href特点值为https://example.com或https://another.com的a 元素
    //a[@href='https://example.com' or @href='https://another.com']
    
  • 函数谓语

    Xpath供给了许多内置函数,来应对更杂乱的挑选条件

    • contains((string1, string2)函数:

      • string1:要查找的字符串
      • string2:要查找的字符串
      # 选取class包含"book"的img标签
      images = root.xpath('//img[contains(@src,"book")]')
      for image in images:
          print(etree.tostring(image, encoding='unicode'))
      
    • starts-with(string1, string2)函数:

      查看一个字符串是否以指定字符的前缀开端,是回来true,否回来false

      • string1:要查看的字符串
      • string2:作为前缀的字符串
      # 选取一切href以https://最初的a标签
      all_a = root.xpath('//a[starts-with(@href,"https:")]')
      for a in all_a:
          print(etree.tostring(a, encoding='unicode'))
      
  • 文本内容谓语

    用于挑选包含特定文本内容的节点,能够运用text()函数来提取节点的文本内容

    # 挑选运用包含"三国"文本的p标签
    paragraphs = root.xpath('//p[contains(text(),"三国")]')
    for p in paragraphs:
        print(etree.tostring(p, encoding='unicode'))
    

通配符

xpath供给了多种通配符,用于在途径表达式中匹配不知道的元素,特点,或任何节点.这些通配符非常有用,尤其是当不确定详细节点称号和结构的情况下

通配符 描绘
* 匹配任何元素节点。 一般用于浏览器copy xpath会呈现
@* 匹配任何特点节点。
node() 匹配任何类型的节点。

运用*匹配任何元素节点

  • * 是最常用的通配符之一,其能够匹配任何元素,而不需求详细标签名.这在不确定元素称号或期望挑选一切类型的元素时非常有用
# 挑选一切 div 下的一切子元素
divs = root.xpath("//div/*")
for div in divs:
    print(etree.tostring(div, encoding='unicode'))

运用@* 匹配任何特点节点

  • @* 用于匹配任何特点节点,而不必指定详细特点称号,在你不确定特点称号或期望挑选一切特点时非常有用
# 挑选一切 a 元素的一切特点
all_a = root.xpath('//a/@*')
for a in all_a:
    print(a)

运用node()匹配任何类型的节点

  • node() 是一个更通用的通配符,其能匹配任何类型节点,包含元素节点,文本节点,特点节点,注释节点等等,其在需求挑选不仅仅是元素节点是非常有用
# 挑选一切 ul 下的一切子节点(包含文本节点)
nodes = root.xpath('//ul/node()')
print(nodes)
#output-> ['\n ', <Element li at 0x2009621d800>, '\n,...] 

XPath,re正则,BeautifulSoup比照

在之前的学习中咱们首要学习了re正则表达式,其次学习了愈加快捷的bs4,哪为何还要学习XPath解析呢,接下来咱们将它们的长处和适用场景进行比照学习

东西 长处 缺陷 适用场景
XPath 强壮的途径表达能力,支撑层级结构和条件查询 学习曲线较陡,对不标准 HTML 容错性较差 结构化杰出的 XML/HTML,杂乱查询
re 灵活性高,合适处理纯文本中的形式匹配 不合适解析 HTML/XML,可读性差 从纯文本中提取特定形式的数据
BeautifulSoup 易于运用,容错性强,合适初学者 功用稍低,功用有限 不标准的 HTML,简略数据提取,网页抓取
  • 总结
    • 若需求处理结构杰出的XML或HTML文档,并需求进行杂乱查询,那么XPath解析是最佳挑选
    • 若需求从纯文本中提取特定形式的数据时,如从日志中提取日期,IP地址的,re正则表达式是最佳挑选
    • 需求解析不标准的 HTML 或许只需求进行简略的数据提取,BeautifulSoup 是最友爱的挑选

扫描二维码推送至手机访问。

版权声明:本文由51Blog发布,如需转载请注明出处。

本文链接:https://www.51blog.vip/?id=161

分享给朋友:

“Xpath解析及其语法” 的相关文章

Scala办法和函数

Scala办法和函数

办法和函数的效果几乎是相同的,可是函数在运用的过程中愈加灵敏和多样化 scala中函数是头号公民 . 能够作为办法的回来值和参数运用 scala是一个集面向目标和面向函数于一身的编程言语 , 灵敏的函数是函数式编程的一种表现 函数的运用使代码愈加简练和灵敏 函数 scala中一种函数式编程言语 ,函...

php关键字, 定义与声明

1. 变量定义: `int`:定义整型变量 `float`:定义浮点型变量 `string`:定义字符串变量 `bool`:定义布尔型变量 `array`:定义数组变量 `object`:定义对象变量 `resource`:定义资源类型变量 `null...

r语言不等于,深入解析与使用技巧

在R语言中,不等于的运算符是 `!=` 或者 ``。例如,如果你有两个变量 `a` 和 `b`,你可以使用以下方式来检查它们是否不相等:```Ra != b 使用 != 运算符a b 使用 运算符```这两种方式都是有效的,不过 `` 运算符在R语言中不是特别常用,它主要来源于其他编程语...

delphi,从入门到精通

Delphi 是一种编程语言和集成开发环境(IDE),主要用于开发桌面、移动、Web 和控制台应用程序。它是由 Embarcadero Technologies(前身为 Borland)开发,最初在1995年推出。Delphi 是基于 Pascal 语言,但后来加入了面向对象编程的特性,使其成为了一...

java连接数据库

java连接数据库

Java连接数据库通常涉及以下几个步骤:1. 加载数据库驱动:首先需要加载数据库的驱动程序。这通常通过调用 `Class.forName` 方法完成。2. 建立数据库连接:使用 `DriverManager.getConnection` 方法来建立与数据库的连接。你需要提供数据库的URL、用户名和密...

python不等于,深入解析Python中的不等于运算符

python不等于,深入解析Python中的不等于运算符

在Python中,当使用 `!=` 运算符时,如果两个值不相等,则返回 `True`。在这个例子中,变量 `x` 的值为5,变量 `y` 的值为7,它们不相等,所以 `x != y` 的结果是 `True`。深入解析Python中的不等于运算符在Python编程语言中,不等于运算符是一个非常重要的概...