Xpath简单匹配标签内容

Xpath
Xpath全程为xml路径语言,用来确定xml文档中某部分位置的语言。
使用Xpath需要安装lxml库,lxml为Python的第三方库,安装方法可以直接下载库文件手动添加到python库文件夹下或者使用pip安装。
导入模块 from lxml import etree
Selector=etree.HTML(网页源代码) 该指令可以把网页源代码转换成可以被Xpath识别和匹配的对象,
Selector.xpath() 括号内参数为一段符号。这样便可以识别匹配出感兴趣的内容。

在使用正则表达式来寻找感兴趣内容的时候,需要知道感兴趣内容附近内容的特征。
而Xpath则不同。

Xpath与HTML的结构:
HTML为树状结构,可以逐层展开,逐层定位。Xpath就是根据这一特性来工作的。
其中两根斜线 // 定位根节点,一根斜线 / 表示往下层寻找,其中一个HTML标签表示一层,提取文本内容则是 /text() ,要提取某个属性的内容则 /@xxx (xxx为具体属性的名字)。

首先,使用xpath提取一般内容:
根据HTML中的标签来进行定位。如下面一段简短代码:

# -*- coding: utf-8 -*-
"""
Created on Fri May 20 22:21:12 2016

@author: ldl
"""

from lxml import etree
html='''
<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title>测试-常规用法</title>
</head>
<body>
<div id="content">
    <ul id="useful">
        <li>这是第一条信息</li>
        <li>这是第二条信息</li>
        <li>这是第三条信息</li>
    </ul>
    <ul id=“useless”>
        <li>1不需要的信息</li>
        <li>2不需要的信息</li>
        <li>3不需要的信息</li>
    </ul>

    <div id="url">
        <a href="属性1">这个不属于属性值</a>
        <a href="属性2" href2="属性3">这个也不是属性值</a>
        <a href3="attribute">3也不是属性值</a>
   </div>
</div>

</body>
</html>
'''
selector=etree.HTML(html)

#提取文本信息
content=selector.xpath('//ul[@id="useful"]/li/text()')
for each in content:
    print each

#此语句打印出了标签a下的内容
content2=selector.xpath('//a/text()')
for each in content2:
    print each   

#提取属性
content3=selector.xpath('//a/@href')
for each in content3:
    print each

content4=selector.xpath('//a/@href2')
print content4[0]

content5=selector.xpath('//a[@href3="attribute"]/text()')
print content5[0]

其中html代表一个简单网页的源代码,而使用etree.HTML(html)将源代码html转换成xpath可以处理的对象,然后该对象调用xpath成员进行相应处理得到感兴趣的内容。
输出文本
如上面代码所示xpath成员的参数’//ul[@id=”useful”]/li/text()’该参数表示在根目录下的ul标签[]内的内容表示当有多个ul标签的时候,用中括号中的内容来定位具体哪个标签,后面的斜杠后li代表li标签/text()表示要取的是li标签下的文本内容。此时根据该语句而得到的输出为:
这是第一条信息
这是第二条信息
这是第三条信息
该语句中如果把ul后面的中括号去掉,由于html中有两处ul标签,且两处ul标签下都有li标签,因此两处ul下的li都会定位到,因而输出:
这是第一条信息
这是第二条信息
这是第三条信息
1不需要的信息
2不需要的信息
3不需要的信息

输出属性
如上面代码中提取网页的代码:
content3=selector.xpath(‘//a/@href’)
在源代码html中,href对应的等号右边为href的属性内容,也就是href的值,其定位方式与前面文本定位方式是一样的,但是取内容方式有差别,取文本内容是直接用text(),而取属性是用@xxx,xxx为要取的属性,该表达式为取出该属性具体的内容。同理,content3=selector.xpath(‘//a/@href’)取出了a标签中href3对应的属性内容。此处由于有两处标签a下都有href,因而返回两处属性都会返回,此处打印内容为:
属性1
属性2
注意,xpath取出的内容是以列表形式返回的,因而如果取出其中一个元素或者其中只有一个元素的时候,需要用访问列表元素的方式来取出。且上面的html内容比较简单,标签不复杂,因而xpath中的具体参数也比较简单,对于标签层次较多的网页文件而言,则表达式的层次结构也应该较明确,一层一层标签标示出来,否则容易导致匹配到其他有相同标签的内容上去而没有真正找出感兴趣内容。

### 回答1: XPath 可以使用 `@style` 属性来匹配带有 style 属性的节点。 例如,要匹配 `<div>` 元素中 `@style` 属性值包含 `"color:red;"` 的节点,可以使用以下 XPath 表达式: ``` //div[contains(@style, "color:red;")] ``` 解释: - `//div`:选取所有 `<div>` 元素。 - `contains(@style, "color:red;")`:选取 `@style` 属性值包含 `"color:red;"` 的节点。 如果要匹配 `@style` 属性值以 `"color:red;"` 开头的节点,可以使用以下 XPath 表达式: ``` //div[starts-with(@style, "color:red;")] ``` 解释: - `//div`:选取所有 `<div>` 元素。 - `starts-with(@style, "color:red;")`:选取 `@style` 属性值以 `"color:red;"` 开头的节点。 ### 回答2: 在XPath中,我们无法直接使用CSS样式来匹配元素,但是可以通过一些方法来实现类似的效果。 一种方法是使用XPath的属性匹配功能。通过使用@符号后跟属性名,我们可以选择具有特定属性值的元素。例如,使用[@class='example']可以匹配class属性值为'example'的所有元素。 另一种方法是使用XPath的逻辑运算符和关系运算符来筛选元素。可以使用逻辑运算符如and、or和not结合多个条件,以便精确指定需要匹配的元素。关系运算符如contains、starts-with和ends-with可以用于模糊匹配属性值。 此外,我们还可以使用XPath的轴来定位具有特定关系的元素。例如,可以使用子代轴(/)选择所有直接子元素,或者使用后代轴(//)选择所有子孙元素。通过组合使用轴和属性匹配,可以更精确地定位需要的元素。 最后,我们可以使用XPath的位置选择器来选择某个位置上的元素。位置选择器使用方括号中的索引号来指定元素在同级节点中的位置。例如,[1]选择第一个匹配的元素,[last()]选择最后一个匹配的元素。 总结来说,虽然XPath本身没有提供类似CSS样式选择器的功能,但是通过属性匹配、逻辑运算符、关系运算符、轴和位置选择器的组合使用,我们可以实现类似的效果,从而对指定的元素进行选择和定位。 ### 回答3: XPath 是一种用于定位 XML 和 HTML 文档中节点的语言。当我们想要使用 XPath 匹配某些节点时,我们也可以使用样式提供匹配条件。 XPath 具有以下几种常见的样式匹配方式: 1. 标签匹配: 这是最简单匹配方式,我们可以使用标签名作为样式。例如,如果我们想要匹配所有的 <div> 标签,可以使用样式 `//div`。 2. 属性匹配: 我们可以使用节点的属性来进行匹配。例如,如果我们想要匹配所有 `class` 属性为 "example" 的 <div> 标签,可以使用样式 `//div[@class="example"]`。 3. 位置匹配XPath 也支持根据节点在文档中的位置进行匹配。例如,如果我们想要匹配第一个 <div> 标签,可以使用样式 `//div[1]`。 4. 文本内容匹配XPath 还可以根据节点的文本内容进行匹配。例如,如果我们想要匹配文本内容为 "Hello" 的 <p> 标签,可以使用样式 `//p[text()="Hello"]`。 5. 多条件匹配: 我们还可以将多个条件结合在一起进行匹配。例如,如果我们想要匹配同时满足 `class` 为 "example" 且 `id` 为 "test" 的 <div> 标签,可以使用样式 `//div[@class="example" and @id="test"]`。 综上所述,XPath 在样式匹配方面提供了多种灵活的方式,可以根据节点的标签名、属性、位置和文本内容进行匹配,我们可以根据具体的需求选择适合的样式进行匹配
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

弹指间LDL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值