首页 > 编程语言 >【爬虫】python数据挖掘-lxml模块-3

【爬虫】python数据挖掘-lxml模块-3

时间:2023-10-04 21:33:36浏览次数:52  
标签:xpath lxml etree python item html href 数据挖掘

Python爬虫

  • 掌握 lxml模块中使用xpath语法定位元素提取属性值或文本内容
  • 掌握 lxml模块中etree.tostring函数的使用

1. lxml模块的安装与使用示例

lxml模块是一个第三方模块,安装之后使用

1.1 lxml模块的安装

对发送请求获取的xml或html形式的响应内容进行提取

pip/pip3 install lxml
知识点:了解 lxml模块的安装

1.2 爬虫对html提取的内容

  • 提取标签中的文本内容
  • 提取标签中的属性的值
  • 比如,提取a标签中href属性的值,获取url,进而继续发起请求

1.3 lxml模块的使用

  1. 导入lxml 的 etree 库
    from lxml import etree
  2. 利用etree.HTML,将html字符串(bytes类型或str类型)转化为Element对象,Element对象具有xpath的方法,返回结果的列表
html = etree.HTML(text) 
ret_list = html.xpath("xpath语法规则字符串")
  1. xpath方法返回列表的三种情况
  • 返回空列表:根据xpath语法规则字符串,没有定位到任何元素
  • 返回由字符串构成的列表:xpath字符串规则匹配的一定是文本内容或某属性的值
  • 返回由Element对象构成的列表:xpath规则字符串匹配的是标签,列表中的Element对象可以继续进行xpath

1.4 lxml模块使用示例

运行下面的代码,查看打印的结果

from lxml import etree
text = ''' 
<div> 
  <ul> 
    <li class="item-1">
      <a href="link1.html">first item</a>
    </li> 
    <li class="item-1">
      <a href="link2.html">second item</a>
    </li> 
    <li class="item-inactive">
      <a href="link3.html">third item</a>
    </li> 
    <li class="item-1">
      <a href="link4.html">fourth item</a>
    </li> 
    <li class="item-0">
      a href="link5.html">fifth item</a>
  </ul> 
</div>
'''

html = etree.HTML(text)

#获取href的列表和title的列表
href_list = html.xpath("//li[@class='item-1']/a/@href")
title_list = html.xpath("//li[@class='item-1']/a/text()")

#组装成字典
for href in href_list:
    item = {}
    item["href"] = href
    item["title"] = title_list[href_list.index(href)]
    print(item)

2 练习

将下面的html文档字符串中,将每个class为item-1的li标签作为1条新闻数据。提取a标签的文本内容以及链接,组装成一个字典。

text = ''' <div> <ul> 
        <li class="item-1"><a>first item</a></li> 
        <li class="item-1"><a href="link2.html">second item</a></li> 
        <li class="item-inactive"><a href="link3.html">third item</a></li> 
        <li class="item-1"><a href="link4.html">fourth item</a></li> 
        <li class="item-0"><a href="link5.html">fifth item</a> 
        </ul> </div> '''
  • 注意:
  • 先分组,再提取数据,可以避免数据的错乱
  • 对于空值要进行判断
  • 参考代码
from lxml import etree
text = '''

'''

#根据li标签进行分组 html = etree.HTML(text) li_list = html.xpath("//li[@class='item-1']")

#在每一组中继续进行数据的提取 for li in li_list: item = {} item["href"] = li.xpath("./a/@href")[0] if len(li.xpath("./a/@href"))>0 else None item["title"] = li.xpath("./a/text()")[0] if len(li.xpath("./a/text()"))>0 else None print(item)

------

##### 知识点:掌握 lxml模块中使用xpath语法定位元素提取属性值或文本内容

------



## 10. lxml模块中etree.tostring函数的使用

> 运行下边的代码,观察对比html的原字符串和打印输出的结果

```python
from lxml import etree
html_str = ''' <div> <ul> 
      <li class="item-1"><a href="link1.html">first item</a></li> 
      <li class="item-1"><a href="link2.html">second item</a></li> 
      <li class="item-inactive"><a href="link3.html">third item</a></li> 
      <li class="item-1"><a href="link4.html">fourth item</a></li> 
      <li class="item-0"><a href="link5.html">fifth item</a> 
      </ul> </div> '''

html = etree.HTML(html_str)

handeled_html_str = etree.tostring(html).decode()
print(handeled_html_str)

3.1 现象和结论

打印结果和原来相比:

  1. 自动补全原本缺失的li标签
  2. 自动补全html等标签
<html><body><div> <ul> 
<li class="item-1"><a href="link1.html">first item</a></li> 
<li class="item-1"><a href="link2.html">second item</a></li> 
<li class="item-inactive"><a href="link3.html">third item</a></li> 
<li class="item-1"><a href="link4.html">fourth item</a></li> 
<li class="item-0"><a href="link5.html">fifth item</a> 
</li></ul> </div> </body></html>

结论

  • lxml.etree.HTML(html_str)可以自动补全标签
  • lxml.etree.tostring函数可以将转换为Element对象再转换回html字符串
  • 爬虫如果使用lxml来提取数据,应该以lxml.etree.tostring的返回结果作为提取数据的依据

知识点:掌握 lxml模块中etree.tostring函数的使用


标签:xpath,lxml,etree,python,item,html,href,数据挖掘
From: https://blog.51cto.com/u_16279991/7706742

相关文章

  • 使用python进行文件夹中图片文件名提取 并进行填充
    如题#-*-coding:utf-8-*-#@Time:2023/10/419:26#@Author:龙俊威#@File:sortall.py#@Software:PyCharmimportosfromPILimportImageimportmatplotlib.pyplotaspltimportnumpyasnppath=filepath='C:\\Users\Administrator\Desk......
  • Python Weakref弱引用
    背景在开始讨论弱引用的实现之前,我们先来看看什么是弱引用以及弱引用的作用。在我们平常编写代码的时候我们经常会使用引用,了解一下Python,我们就会知道,当一个对象的引用为0时,才会销毁该对象。那么比如我们现在需要维护这样一个东西:不断向一个多线程程序发送数据,同时引入一个缓......
  • Python中的变量
    Python中的变量变量的定义程序中,数据都临时存储在内存中。每一个被存储在内存的数据都有一个内存地址。其中特定的数据被我们所使用,因此我们为那些内存地址定义了名称。这一名称被称作标识符,又称变量名。而与变量名对应内存地址中的数据被称为变量值。总结:变量为内存中特定的......
  • python_day3
    Python_day31、列表index=0whileindex<len(列表): 元素=列表[index]对元素进行处理index+=1方法2:for临时变量in数据容器: 对临时变量进行处理while循环可以控制循环条件,但是for循环不行2、元组元组一旦被定义就不能被修改元组:使用小括号,且使......
  • 笨办法学Python3 习题20 函数和文件
    脚本函数运行内容:系统模块导入参数变量解包参数变量(脚本,文件变量1)定义函数1,执行读取文件定义函数2,执行读取位置移动到文本开头定义函数3(参数1,参数2),执行打印参数1,读取参数2的一行打开文件变量1赋值刚创的文档变量调用函数1,读取文件调用函数2,读取位置移动到文本开头......
  • 笨办法学Python3 习题19 函数和变量
    定义调用函数:全局变量名和函数变量名避免取相同的名字函数之外的变量不会改变函数中原来的变量,调用函数时会被临时创建,函数运行完就会被丢弃定义函数(参数变量1,参数变量2):    函数命令打印你有参数变量1的干酪    打印你有参数变量2的干酪盒子   ......
  • 笨办法学Python3 习题18 命名、变量、代码和函数
    知识点:定义函数的格式def函数名1(参数1,参数2):   函数命令def函数名2(*args):   解包   函数命令def函数名3(参数1):   函数命令def函数名4():  # 可以是无参数的函数   函数命令函数名1(参数值,参数值)#调用函数1函数名2(参数值,参数值)#......
  • python多进程:fork模式和spawn模式
    python多进程:fork模式和spawn模式fork模式1.仅unix系统支持,并且是unix系统的默认模式.2.使用该模式创建子进程的时候,会复制父进程的全部变量,支持传参(任意类型)给子进程,但是不会复制父进程的线程.3.该模式相当于将父进程的内存复制一份用于创建子进程.但是由于不复制线程......
  • 笨办法学Python3 习题17 更多文件操作
    脚本运行内容:系统模块导入参数变量导入os.path模块调用exists函数  解包参数变量(脚本,被复制文件1,粘贴到文件2)打印语句,需要复制文件1内容到文件2打开文件1读取文件1打印语句,中间用到格式化,len(X)函数来运算文件1中字符长度打印语句,中间用到格式化,exists(Y)函数......
  • 流畅的python笔记 (二) 2.序列构成的数组
    内置序列类型分类1:容器序列(能存放不同类型):list,tuple,collections.deque扁平序列(不能存放不同类型):str,bytes,bytearray,memoryview,array.array分类2:可变序列(能被修改):list,bytearray,array.array,collections.deque,memoryview不可变序列:tuple,str,bytes列表推导......