当前位置:   article > 正文

python爬虫之lxml_python lxml

python lxml

lxml:python 的HTML/XML的解析器

        lxml是Python中一个非常强大的XML和HTML处理库。它是基于C语言的libxml2库进行开发的,具有高性能和高效的特点,适用于解析和操作大型XML和HTML文档。

lxml库提供了一些非常方便的功能,包括:

  1. 解析XML和HTML文档:lxml可以将XML和HTML文档解析为树状结构,以便于对文档进行操作和查询。
  2. 定位元素:lxml支持使用XPath和CSS选择器来定位文档中的元素,从而方便地提取出所需的数据。
  3. 修改文档:lxml可以方便地对文档进行修改、添加、删除等操作,比如修改元素的属性或文本内容。
  4. 序列化和反序列化:lxml可以将解析后的文档序列化为字符串或写入文件,也可以将字符串反序列化为文档对象。
  5. 命名空间处理:lxml可以处理包含命名空间的XML文档,并提供了方便的方式来处理命名空间。

使用lxml库需要先安装lxml模块,在Python中可以使用pip命令进行安装:

pip install lxml

下面是一个使用lxml库解析XML文档的示例代码:

  1. from lxml import etree
  2. # 解析XML文档
  3. doc = etree.parse('example.xml')
  4. # 使用XPath定位元素
  5. elements = doc.xpath('//book')
  6. # 输出元素内容
  7. for element in elements:
  8. print(element.text)

以上代码首先导入了lxml库中的etree模块,然后使用etree模块的parse方法解析了一个名为example.xml的XML文档,接着使用XPath定位到了所有的book元素,并输出了其内容。

除了解析XML文档,lxml还可以用于解析和修改HTML文档,具体的使用方法可以参考lxml官方文档。

etree模块

        etree模块是Python中的一个XML处理模块,可以用于解析和操作XML文档。

该模块提供了ElementTree类,该类是一个对象模型,可以表示XML文档中的元素和它们之间的关系。通过使用ElementTree类的方法,可以轻松地遍历、搜索和修改XML文档。一些常用的方法包括:

etree.parse(filename)从文件中解析XML文档并返回一个ElementTree对象。
etree.fromstring(xmlstring)从字符串中解析XML文档并返回一个ElementTree对象。
etree.Element(tagname)创建一个具有给定标签名的元素。
element.find(xpath)从给定元素中查找第一个匹配给定XPath表达式的子元素,并返回该元素。
element.findall(xpath)从给定元素中查找所有匹配给定XPath表达式的子元素,并返回一个列表。
element.text获取或设置给定元素的文本内容。
element.attrib获取或设置给定元素的属性。

除了ElementTree类,etree模块还提供了其他一些类和方法,用于处理XML文档,例如Element类、ElementPath类和ElementTree类等。

要使用etree模块,需要先安装lxml库。可以通过在命令行中运行pip install lxml命令来安装lxml库。

下面是一个使用etree模块的例子,假设有一个名为example.xml的XML文档:

  1. from lxml import etree
  2. # 解析XML文档
  3. tree = etree.parse('example.xml')
  4. # 获取根元素
  5. root = tree.getroot()
  6. # 遍历所有的book元素
  7. for book in root.findall('book'):
  8. # 获取title元素的文本内容
  9. title = book.find('title').text
  10. print(title)

这个例子解析了example.xml文档,并遍历了所有的book元素,然后获取了每个book元素的title元素的文本内容并进行了打印。

应用案例

        对网站的首页包括每一个分页的图片进行爬取

  

首先,导入需要的request,etree,os的模块,以及指定爬取的网址和请求头

  1. import requests
  2. from lxml import etree
  3. import os
  4. if __name__=="__main__":
  5. url="https://pic.netbian.com/4kyouxi"
  6. headers = {
  7. 'User-Agent': "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36 Edg/122.0.0.0"
  8. }

再通过requests.get().content获取网站首页的HTML数据,F12观察使用xpath定位多个li标签

  1. page_text=requests.get(url=url,headers=headers).content
  2. tree=etree.HTML(page_text)
  3. h3_list=tree.xpath('//*[@id="main"]/div[3]/ul/li')

  

从上边xpath会返回一个li标签的列表,再用一个循环,然后我们能够单独对每一张图片进行处理,

@src可以获取图片的属性的值,因为xpath返回的是一个列表,所以可以用【0】来获取其中的值

text()可以获取标签中的文本内容,借此作为图片的名字,利用os创建的目录来保存每次爬取的图片

  1. if not os.path.exists('./4kLibs'):
  2. os.mkdir('./4kLibs')
  3. for a_text in h3_list:
  4. img_src="https://pic.netbian.com/"+a_text.xpath('./a/img/@src')[0]
  5. img_name=a_text.xpath('./a/b/text()')[0]+'.jpg'
  6. img_data=requests.get(url=img_src,headers=headers).content
  7. img_path='./4kLibs/'+img_name
  8. with open(img_path,'wb')as fp:
  9. fp.write(img_data)
  10. print(img_name+'下载成功!')

最后,为实现分页的中所包含的图片进行爬取,我先可以对其网站的url观察一下

发现网站首页和第2页的url的区别在有一个index_2html

而且第3页的内容为index_3html,默认首页是没有这index_页码html的,那么我们就可以进行一个判断,如果它的url不是第一页就加上index.数字html嘛,循环多少次我们以上的步骤就是获取多少分页的全部图片

  1. for ur in range(1,3):
  2. if ur>1:
  3. url = url + '/index_' + str(ur) + '.html'

完整代码

  1. import requests
  2. from lxml import etree
  3. import os
  4. if __name__=="__main__":
  5. url="https://pic.netbian.com/4kyouxi"
  6. headers = {
  7. 'User-Agent': "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Mobile Safari/537.36 Edg/122.0.0.0"
  8. }
  9. for ur in range(1,3):
  10. if ur>1:
  11. url = url + '/index_' + str(ur) + '.html'
  12. page_text=requests.get(url=url,headers=headers).content
  13. tree=etree.HTML(page_text)
  14. h3_list=tree.xpath('//*[@id="main"]/div[3]/ul/li')
  15. if not os.path.exists('./4kLibs'):
  16. os.mkdir('./4kLibs')
  17. for a_text in h3_list:
  18. img_src="https://pic.netbian.com/"+a_text.xpath('./a/img/@src')[0]
  19. img_name=a_text.xpath('./a/b/text()')[0]+'.jpg'
  20. img_data=requests.get(url=img_src,headers=headers).content
  21. img_path='./4kLibs/'+img_name
  22. with open(img_path,'wb')as fp:
  23. fp.write(img_data)
  24. print(img_name+'下载成功!')

点击运行就可以获取每一个分页的内容啦

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/喵喵爱编程/article/detail/1006318
推荐阅读
相关标签
  

闽ICP备14008679号