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 """