python爬虫系列–lxml(etree/parse/xpath)的使用

python爬虫系列–lxml(etree/parse/xpath)的使用lxml python 的 HTML XML 的解析器官网文档 https lxml de 使用前 需要安装安 lxml 包功能 1 解析 HTML 使用 etree HTML text 将字符串格式的 html 片段解析成 html 文档 2 读取 xml 文件 3 etree 和 XPath 配合使用 lxml etree 的使用 加载本地中的 htmletree HTML te

lxml:python 的HTML/XML的解析器

官网文档:https://lxml.de/

使用前,需要安装安 lxml 包

功能:

  • 1.解析HTML:使用 etree.HTML(text) 将字符串格式的 html 片段解析成 html 文档
  • 2.读取xml文件
  • 3.etree和XPath 配合使用
lxml-etree的使用:加载本地中的html
etree.HTML(text)使用
from lxml import etree text = ''' 
   
  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
'''
html = etree.HTML(text) # 将字符串格式的文件转化为html文档 print(html) #==> 表明这是一个html文档 str = etree.tostring(html).decode() # 将html文档转化为二进制的字符串格式 print(str) # ==> 输出上面text中的内容
etree.parse()
from lxml import etree
html01 = etree.parse('demo01.html', etree.HTMLParser()) # demo01.html是和当前py文件同级的文件 print(html01) #⇒ 
   
     返回一个节点树 
    result = etree.tostring(html01) print(result.decode('utf-8')) # ==> 输出demo01.html中的内容  
# lxml-etree读取文件 from lxml import etree

html = etree.parse('demo01.html', etree.HTMLParser()) print(type(html)) # 
   
     返回节点树 
    # 查找所有 li 节点 rst = html.xpath('//li') #//代表在任意路径下查找节点为li的所有元素 print(type(rst)) # ==> 
    print(rst) # ==> [ 
   
     , 
    
      , 
     
       ] 找到的所有符合元素的li节点 
      
     
    # 查找li下带有 class 属性值为 one 的元素 rst2 = html.xpath('//li[@class="one"]') print(type(rst2)) # ==> 
    print(rst2) # ==>[ 
   
     ] 
    # 查找li带有class属性,值为two的元素,下的div元素下的a元素 rst3 = html.xpath('//li[@class="two"]/div/a') # 
    rst3 = rst3[0] #选中res3列表中的第一个元素 print('-------------\n',type(rst3)) # ==> 
    print(rst3.tag) # ==>输出res3的标签名 print(rst3.text) # ==> 输出res3中的文本内容 
etree和XPath 配合使用
# lxml-etree读取文件 from lxml import etree

html = etree.parse('demo01.html', etree.HTMLParser()) print(type(html)) # 
   
     返回节点树 
    # 查找所有 li 节点 rst = html.xpath('//li') #//代表在任意路径下查找节点为li的所有元素 print(type(rst)) # ==> 
    print(rst) # ==> [ 
   
     , 
    
      , 
     
       ] 找到的所有符合元素的li节点 
      
     
    # 查找li下带有 class 属性值为 one 的元素 rst2 = html.xpath('//li[@class="one"]') print(type(rst2)) # ==> 
    print(rst2) # ==>[ 
   
     ] 
    # 查找li带有class属性,值为two的元素,下的div元素下的a元素 rst3 = html.xpath('//li[@class="two"]/div/a') # 
    rst3 = rst3[0] #选中res3列表中的第一个元素 print('-------------\n',type(rst3)) # ==> 
    print(rst3.tag) # ==>输出res3的标签名 print(rst3.text) # ==> 输出res3中的文本内容 

xpath的基本使用

XPath 是一门在 XML/HTML 文档中查找信息的语言。XPath 可用来在 XML /HTML文档中对元素和属性进行遍历。

lxml-etree读取文件

1.获取某个标签中的具体内容

方法一:直接写到a标签
html = etree.HTML(wb_data)
html_data = html.xpath('//li/a') print(html) # 
   
     html文档 也就是根节点 
    print(html_data) #[ 
   
     , 
    
      , 
     
       , 
      
        , 
       
         ] 选取的元素节点 
        
       
      
     
    for i in html_data: print(i.text) # 通过i.text输出具体内容 
方法二:在写xpath时候直接在路径后面跟/text()
html = etree.HTML(wb_data)
html_data = html.xpath('//li/a/text()') print(html_data)# ['first item', 'second item', 'third item', 'fourth item', 'fifth item'] for i in html_data: print(i) 

2. 打开读取html文件 psrse

html = etree.parse('demo01.html',etree.HTMLParser()) # 拿到整个html文档 也就是节点树 # print(html) res = html.xpath('//li') # [ 
   
     , 
    
      , 
     
       ] 
      
     
    # print(res[0].text) # 1 输出文本 str = etree.tostring(html) #转化为二进制  str = str.decode('utf-8') # 解码 print(str) 

3. 拿到某个标签属性的值

html = etree.HTML(wb_data)  # 内部
html1 = etree.parse('demo01.html',etree.HTMLParser()) # 外部引入的文件
html_data = html1.xpath('//li/div/a/@href')
for i in html_data:
    print(i)

4.我们知道我们使用xpath拿到得都是一个个的ElementTree对象,所以如果需要查找内容的话,还需要遍历拿到数据的列表。

5.绝对路径和相对路径的使用

绝对路径 一个斜杠开头 从根开始查找(以下代码仅供示范,不保证正确性)
html = etree.HTML(wb_data) abs_load = html.xpath('/html/body/p/ul/li/a[@href="link2.html" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" ]/text()') print(abs_load) 
相对路径的使用
html = etree.HTML(wb_data)
html_data = html.xpath('//a') print(html_data) for i in html_data: print(i) 

实例 取网站的某个具体元素的xpath的路径

打开控制台,选中具体的元素,右键找到copy—–>Copy Xpath

自此,爬虫的lxml模块基本了解结束了,应该是对爬虫中的文件操作有了基本的认识了,文笔不好,请多包涵。有任何问题大家可以给我留言。共同探讨和进步。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212938.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午6:54
下一篇 2026年3月18日 下午6:54


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号