xpath语法基本使用

from lxml import etree

"""
lxml是html(超文本标记语言,显示数据)和xml(可扩展标记语言,传输和存储数据)文档的解析器,当我们使用需要用到css选择器或xpath来获取数据时用于
html文本解析成树形结构  在解析的过程中如要到html代码不规范或不完整的话,lxml会自动修复从而提高解析效率
"""

html_txt = """
<body>
<div>
<ul><li><a>1</a></li><li class="me kk"><a>2</a></li></ul>
<ul><li><a>3</a></li><li><a>4</a></li></ul>
</div>
<div>
<ul name="meme"><li><a>5</a></li><li name="me"><a>6</a></li></ul>
<ul><li><a>7</a></li><li><a>8</a></li></ul>
</div>
</body>
"""
html = etree.HTML(html_txt)
# 返回的是一个元素对象
print(html)
# 将解析后的html转为字符串输出(tostring()输出的是bytes类,后面需要调用decode()方法将其转为str)
print(etree.tostring(html).decode("utf-8"))
# / 代表从当前节点选取直接子节点  建议单斜杠前带有元素标签,不要使用html标签  不要已单斜杠结尾,会报xpath的表达式错误
# 1
"""
data = html.xpath("body/div/ul/li")
print(data)
for d in data:
    a_txt = d.xpath("a")
    print(a_txt[0])
"""
# 2
data = html.xpath("body/div/ul/li/a")
# 返回a元素对象列表
print(data)
for a in data:
    # 返回a元素中的值
    print(a.text)

# // 代表从当前节点选取直接子孙节点  双斜杠开头表示所有子孙节点(相当于全文搜索);双斜杠前带有元素标签表示该元素下的所有子孙节点
# 1  "//*" 匹配所有子孙节点
data = html.xpath("//li[@name='me']")
data = data[0].xpath("a")
print(data[0].text)
# 2
data = html.xpath("body/div//a")
for a in data:
    print(a.text)

# .. 代表选取当前节点的父节点
data1 = html.xpath("//li[@name='me']/..")
data2 = html.xpath("//li[@name='me']/../@name")
data3 = html.xpath("//li[@name='me']/a/text()")  # 在xpath中使用text方法时建议统一在最里层的元素节点下使用
print(data1, data2, data3)

# 属性多值匹配
data = html.xpath("//li[contains(@class, 'kk')]/a")
print(data, data[0].text)

# 按序选择   在选择节点时可能会匹配到多个节点,如想要其中一个可通过索引的方式来获取  注意索引的序号已1开头不是0
data = html.xpath("body/div/ul")
print(data)
data1 = html.xpath("body/div/ul[1]")
print(data1)
data2 = html.xpath("body/div/ul[last()]")
print(data2)
data3 = html.xpath("body/div/ul[position()=2]")  # div节点下第二个ul
print(data3)
data4 = html.xpath("body/div/ul[last()-1]")  # div节点下倒数第二个ul
print(data4)

"""
以上是xpath语法的基本使用,如不满足需求可前往中文手册查看教程 http://www.zvon.org/xxl/XPathTutorial/General_chi/examples.html
"""

 

posted @ 2022-10-04 08:24  和言_噢  阅读(59)  评论(0)    收藏  举报