Xpath和re常用语法

本文详细介绍了XPath在网页抓取和数据分析中的各种高级用法,如过滤class不等于'tiem-tr'的元素、跳过首项和限制范围、文本匹配、选择最后一个元素、排除style属性等。XPath的定位和节点选择功能在此得到了深入解析,适合前端开发者和数据爬虫使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Xpath常用语法

# 不包括标签class值为tiem-tr或者有class的
[@class!='item-tr' or not(@class)]

# 跳过第一个
[position()>1]

# 跳过第一个,不能超过第5个
[position()>1][position()<5]

# 用文本匹配
[text()='下一页']

# 取最后一个
[last()]

# 排除有style属性的标签
[name(.)!='style']

# 多个xpath语句匹配
//ul//a/text() | //li/@class

# child:选取当前节点的子元素
print(ele.xpath('//ul/child::*'))  # 获取ul所有的子元素
print(ele.xpath('//ul/child::li'))  # 获取ul所有子元素中的

# parent:选取当前节点的父节点'
print(ele.xpath('//li/parent::*'))  # 获取li所有的父元素
print(ele.xpath('//li/parent::ul'))  # 获取li所有父元素中的ul

# attribute:选取当前节点的属性
print(ele.xpath('//ul/li/attribute::*'))  # 获取li的所有属性
print(ele.xpath('//ul/li/attribute::class'))  # 获取li所有属性中的class属性

# ancestor:父辈元素 / ancestor-or-self:父辈元素及当前元素
print(ele.xpath('//div[@id="testid"]/ancestor::*'))  # 获取div所有父元素
print(ele.xpath('//div[@id="testid"]/ancestor::div'))  # 获取div所有父元素中的div
print(ele.xpath('//div[@id="testid"]/ancestor-or-self::*'))  # 获取div所有父元素及当前元素
print(ele.xpath('//div[@id="testid"]/ancestor-or-self::div'))  # 获取div所有父元素及当前元素中的div

# following :选取当前节点的结束标签之后的所有节点,包括节点的子孙节点
print(ele.xpath('//li[@class="item-0"]/following::li'))  # 获取li后面的所有节点中的li
for e in ele.xpath('//li[@class="item-0"]/following::li'):
    print(etree.tostring(e))  # 将元素对象转换为字符串,方便查看获取到了什么
    
# preceding:选取当前节点的开始标签之前的所有节点,包括节点的子孙节点
print(ele.xpath('//li[@class="item-0"]/preceding::li'))  # 获取li前面的所有节点中的li
for e in ele.xpath('//li[@class="item-0"]/preceding::li'):
    print(etree.tostring(e))  # 将元素对象转换为字符串,方便查看获取到了什么
    
# following-sibling:选取当前节点之后的所有同级节点
注意跟following的区别是:following-sibling只能匹配同级节点
print(ele.xpath('//li[@class="item-0"]/following-sibling::li'))  # 获取li后面所有同级节点中的li

# preceding-sibling:选取当前节点之前的所有同级节点
注意跟preceding的区别是:preceding-sibling只能匹配同级节点
print(ele.xpath('//li[@class="item-0"]/preceding-sibling::li'))  # 获取li前面所有同级节点中的li

# position:定位
选择偶数项:[position()=(position() mod 2 = 0)]
选择奇数项:[position()=(position() mod 2 != 0)]
ele.xpath('//li[1]') # 选择第一个li
ele.xpath('//li[position()<3]') # 选择定位小于3的li
ele.xpath('//li[position()<6 and position()>3]') # 选择定位大于3小于6的li
ele.xpath('//li[last()]') # 选择最后一个li
ele.xpath('//li[last()-2]') # 选择倒数第三个li
# 重点:匹配奇数项和偶数项
ele.xpath('//tr/td[position()=(position() mod 2 = 0)]') # 匹配tr下面所有的偶数个td
ele.xpath('//tr/td[position()=(position() mod 2 != 0)]') # 匹配tr下面所有的奇数个td

# contains:包含
ele.xpath('//*[contains(text(),"123")]') # 选择所有文本中包含123的节点
ele.xpath('//*[contains(@href, "test")]')  # 选择所有属性href中包含test的节点

# starts-with:以…开始
ele.xpath('//li[starts-with(@class,"test")]')  # 匹配类名以test开头的li

# count:统计节点下的某个子节点数量
选择当前节点下某个子节点数量为多少的元素
ele.xpath('//ul[count(li)>10]')  # 获取子节点li数量超过10个的ul

from lxml import etree

# 读取html code
with open("./ref=sr_1_10.htm") as f:
    html_content = f.read()
    
# 建立解析树
html = etree.HTML(html_content)

# 删除 script标签
for js in html.xpath("//script"):
    js.getparent().remove(js)

javascripts = html.xpath("//script")
print(len(javascripts))

# 删除 style标签
for sty in html.xpath("//style"):
    sty.getparent().remove(sty)

styles = html.xpath("//style")
print(len(styles))

re用法

import re
# 匹配中文
data = """我始终!@@##¥%…………&alkjdfsb1234\n
566667是中国人woaldsfkjzlkcjxv123*())<>
"""
# 匹配所有汉字
print(re.findall('[\u4e00-\u9fa5]', data))
# 匹配所有单字符,英文,数字,特殊符号
print(re.findall('[\x00-\xff]', data))
# 匹配所有非单字符,入汉字和省略号
print(re.findall('[^\x00-\xff]', data))

# sub顺序
data = '2022-01-19'
print(re.sub(r'(\d{4})-(\d{2})-(\d{2})', r'\2-\3-\1', data))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值