当前位置:   article > 正文

Python基础入门之网络爬虫利器:lxml详解

lxml

导语:网络爬虫是数据采集和信息提取的重要工具之一。在Python中,lxml库是一款功能强大且高效的网络爬虫工具,具有解析HTML和XML文档、XPath定位、数据提取等功能。本文将详细介绍lxml库的使用方法,并提供相应的代码示例。

获取更多爬虫相关资源公众号:每日推荐系列!

lxml库
lxml是一个HTML/XML的解析器,主要的功能是解析和提取HTML/XML数据

lxml和正则一样,也是用C语言实现的,是一款高性能的Python HTML/XML解析器,我们可以i利用之前学习的XPath语法,来快速的定位元素及节点信息。

lxml python官方文档:http://lxml.de/index.html


 

lxml

  • lxml这个框架用于对xml文件进行格式化(说明:html文件是一种特殊xml)
  • 安装:pip install lxml
  • etree 全称是element tree这个工具用把一个html文件格式化成一个树形型结构,这个树形结构叫做节点树
    html测试页面
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <title>测试页面</title>
  6. </head>
  7. <body>
  8. <ol>
  9. <li class="haha">醉卧沙场君莫笑,古来征战几人回</li>
  10. <li class="heihei">两岸猿声啼不住,轻舟已过万重山</li>
  11. <li id="hehe" class="nene">一骑红尘妃子笑,无人知是荔枝来</li>
  12. <li class="xixi">停车坐爱枫林晚,霜叶红于二月花</li>
  13. <li class="lala ">商女不知亡国恨,隔江犹唱后庭花</li>
  14. </ol>
  15. <div id="pp">
  16. <div>
  17. <a href="http://www.baidu.com">李白</a>
  18. </div>
  19. <ol>
  20. <li class="huanghe">君不见黄河之水天上来,奔流到海不复回</li>
  21. <li id="tata" class="hehe">李白乘舟将欲行,忽闻岸上踏歌声</li>
  22. <li class="tanshui kkk">桃花潭水深千尺,不及汪伦送我情</li>
  23. </ol>
  24. <div class="hh">
  25. <a href="http://mi.com">雷军</a>
  26. </div>
  27. <ol>
  28. <li class="dudu">are you ok</li>
  29. <li class="meme">Eric,会点编程</li>
  30. </ol>
  31. </div>
  32. </body>
  33. </html>

1,安装lxml库

在开始之前,确保已经安装了Python和pip工具。使用pip命令可以简单地安装lxml库:

2,导入lxml库:

3,解析HTML文档:

lxml可以解析HTML文档,并提供了多种解析器。下面是一个简单的示例,演示如何使用lxml解析HTML文档:

  1. html = """
  2. <html>
  3. <head>
  4. <title>网页标题</title>
  5. </head>
  6. <body>
  7. <h1>欢迎使用lxml</h1>
  8. <p>这是一个示例文档</p>
  9. </body>
  10. </html>
  11. """
  12. # 创建解析器
  13. parser = ET.HTMLParser()
  14. tree = ET.fromstring(html, parser)
  15. # 获取标题
  16. title = tree.findtext('.//title')
  17. print(title) # 输出:网页标题
  18. # 获取<h1>标签下的文本
  19. h1_text = tree.findtext('.//h1')
  20. print(h1_text) # 输出:欢迎使用lxml
  21. # 获取<p>标签下的文本
  22. p_text = tree.findtext('.//p')
  23. print(p_text) # 输出:这是一个示例文档

4,深度解析XML文档:

除了HTML文档,lxml还可以解析XML文档。下面是一个简单的示例,演示如何使用lxml解析XML文档:

  1. xml = """
  2. <root>
  3. <element attribute="value">文本内容</element>
  4. </root>
  5. """
  6. # 创建解析器
  7. parser = ET.XMLParser()
  8. tree = ET.fromstring(xml, parser)
  9. # 获取属性值
  10. attribute_value = tree.find('.//element').get('attribute')
  11. print(attribute_value) # 输出:value
  12. # 获取文本内容
  13. element_text = tree.findtext('.//element')
  14. print(element_text) # 输出:文本内容

5,XPath定位元素:

lxml支持使用XPath表达式定位元素,这使得数据提取更加方便。下面是一个示例,演示如何使用XPath定位元素:

  1. html = """
  2. <html>
  3. <body>
  4. <ul>
  5. <li>苹果</li>
  6. <li>香蕉</li>
  7. <li>橙子</li>
  8. </ul>
  9. </body>
  10. </html>
  11. """
  12. # 创建解析器
  13. parser = ET.HTMLParser()
  14. tree = ET.fromstring(html, parser)
  15. # 使用XPath获取<ul>下的所有<li>元素
  16. li_elements = tree.findall('.//ul/li')
  17. for li in li_elements:
  18. print(li.text) # 输出:苹果、香蕉、橙子

6,属性选择器:

在XPath中,可以使用属性选择器来定位具有特定属性的元素。下面是一个示例,演示如何使用属性选择器:

 
  1. html = """
  2. <html>
  3. <body>
  4. <ul>
  5. <li class="fruit">苹果</li>
  6. <li class="fruit">香蕉</li>
  7. <li class="vegetable">西红柿</li>
  8. </ul>
  9. </body>
  10. </html>
  11. """
  12. # 创建解析器
  13. parser = ET.HTMLParser()
  14. tree = ET.fromstring(html, parser)
  15. # 使用属性选择器获取class为"fruit"的<li>元素
  16. fruit_elements = tree.findall('.//ul/li[@class="fruit"]')
  17. for fruit in fruit_elements:
  18. print(fruit.text) # 输出:苹果、香蕉

7,CSS选择器:

除了XPath,lxml还支持使用CSS选择器来定位元素。下面是一个示例,演示如何使用CSS选择器:

  1. html = """
  2. <html>
  3. <body>
  4. <ul>
  5. <li class="fruit">苹果</li>
  6. <li class="fruit">香蕉</li>
  7. <li class="vegetable">西红柿</li>
  8. </ul>
  9. </body>
  10. </html>
  11. """
  12. # 创建解析器
  13. parser = ET.HTMLParser()
  14. tree = ET.fromstring(html, parser)
  15. # 使用CSS选择器获取class为"fruit"的<li>元素
  16. fruit_elements = tree.cssselect('ul li.fruit')
  17. for fruit in fruit_elements:
  18. print(fruit.text) # 输出:苹果、香蕉

8,数据提取:

lxml可以方便地提取元素中的数据。下面是一个示例,演示如何提取数据:

  1. html = """
  2. <html>
  3. <body>
  4. <ul>
  5. <li class="fruit">苹果</li>
  6. <li class="fruit">香蕉</li>
  7. <li class="vegetable">西红柿</li>
  8. </ul>
  9. </body>
  10. </html>
  11. """
  12. # 创建解析器
  13. parser = ET.HTMLParser()
  14. tree = ET.fromstring(html, parser)
  15. # 使用XPath提取<li>元素中的文本内容
  16. li_elements = tree.findall('.//ul/li')
  17. fruits = [li.text for li in li_elements]
  18. print(fruits) # 输出:['苹果', '香蕉', '西红柿']

9,修改元素:

lxml不仅可以解析和提取数据,还可以修改元素。下面是一个示例,演示如何修改元素:

  1. html = """
  2. <html>
  3. <body>
  4. <h1>旧标题</h1>
  5. </body>
  6. </html>
  7. """
  8. # 创建解析器
  9. parser = ET.HTMLParser()
  10. tree = ET.fromstring(html, parser)
  11. # 修改<h1>元素的文本内容
  12. h1_element = tree.find('.//h1')
  13. h1_element.text = '新标题'
  14. # 将修改后的文档输出为字符串
  15. new_html = ET.tostring(tree, encoding='unicode')
  16. print(new_html)
  17. # 输出:
  18. # <html>
  19. # <body>
  20. # <h1>新标题</h1>
  21. # </body>
  22. # </html>

10,删除元素:

除了修改元素,lxml还可以删除元素。下面是一个示例,演示如何删除元素:

  1. html = """
  2. <html>
  3. <body>
  4. <ul>
  5. <li>苹果</li>
  6. <li>香蕉</li>
  7. <li>橙子</li>
  8. </ul>
  9. </body>
  10. </html>
  11. """
  12. # 创建解析器
  13. parser = ET.HTMLParser()
  14. tree = ET.fromstring(html, parser)
  15. # 删除第一个<li>元素
  16. ul_element = tree.find('.//ul')
  17. li_elements = ul_element.findall('.//li')
  18. ul_element.remove(li_elements[0])
  19. # 将修改后的文档输出为字符串
  20. new_html = ET.tostring(tree, encoding='unicode')
  21. print(new_html)
  22. # 输出:
  23. # <html>
  24. # <body>
  25. # <ul>
  26. # <li>香蕉</li>
  27. # <li>橙子</li>
  28. # </ul>
  29. # </body>
  30. # </html>

11,处理命名空间:

当解析带有命名空间的XML文档时,可以使用lxml来处理命名空间。下面是一个示例,演示如何处理命名空间:

  1. xml = """
  2. <root xmlns:ns="http://example.com">
  3. <ns:element>文本内容</ns:element>
  4. </root>
  5. """
  6. # 创建解析器
  7. parser = ET.XMLParser()
  8. tree = ET.fromstring(xml, parser)
  9. # 使用命名空间前缀获取元素
  10. element = tree.find('.//ns:element', namespaces={'ns': 'http://example.com'})
  11. print(element.text) # 输出:文本内容

12,解析大型文档:

lxml对于大型文档的解析和处理非常高效。可以使用iterparse方法来迭代解析大型文档,从而减少内存占用。下面是一个示例,演示如何解析大型文档:

  1. xml = """
  2. <root>
  3. <element>元素1</element>
  4. <element>元素2</element>
  5. <element>元素3</element>
  6. ...
  7. <element>元素N</element>
  8. </root>
  9. """
  10. # 创建解析器
  11. parser = ET.iterparse(xml)
  12. # 迭代解析元素
  13. for _, element in parser:
  14. if element.tag == 'element':
  15. print(element.text)
  16. element.clear()

13,错误处理:

在使用lxml解析文档时,可能会遇到一些错误。可以通过捕获异常并进行错误处理来提高代码的健壮性。下面是一个示例,演示如何处理错误:

  1. html = """
  2. <html>
  3. <body>
  4. <h1>标题</h1>
  5. <p>文本1</p>
  6. <p>文本2</p>
  7. <p>文本3</p>
  8. </body>
  9. </html>
  10. """
  11. # 创建解析器
  12. parser = ET.HTMLParser()
  13. try:
  14. tree = ET.fromstring(html, parser)
  15. # 在此处进行数据提取等操作
  16. except ET.ParseError:
  17. print("解析出错")

14,lxml和xpath结合使用详解:

  1. from lxml import etree
  2. # 1. 获取所有tr标签
  3. # 2. 获取2个tr标签
  4. # 3. 获取所有class等于even的标签
  5. # 4. 获取所有a标签的href属性
  6. # 5. 获取所有的职位信息(纯文本)
  7. parser=etree.HTMLParser(encoding='utf-8')
  8. html=etree.parse('tencent.html',parser=parser)
  9. # 1. 获取所有tr标签
  10. # //tr
  11. trs=html.xpath("//tr")
  12. for tr in trs:
  13. print(etree.tostring(tr,encoding='utf-8').decode('utf-8'))
  14. # 2. 获取第2个tr标签
  15. trs=html.xpath("//tr[2]")
  16. print(trs)
  17. ''''''
  18. # 3. 获取所有class等于even的标签
  19. trs=html.xpath("//tr[@class='even']")
  20. for tr in trs:
  21. print(etree.tostring(tr,encoding='utf-8').decode('utf-8'))
  22. # 4. 获取所有a标签的href属性
  23. trs=html.xpath("//a/@href")
  24. for tr in trs:
  25. print(tr)
  26. # 5. 获取所有的职位信息(纯文本)
  27. trs=html.xpath("//tr[position()>1]")
  28. for tr in trs:
  29. #在某个标签下执行哦xpath()获取元素,注意加.表明在当前标签下获取
  30. href=tr.xpath(".//a/@href")[0]
  31. fullurl='http://hr.tencent.com'+ href
  32. title=tr.path("./td[1]/text()")[0]
  33. category=tr.path("./td[2]/text()")[0]
  34. nums = tr.path("./td[3]/text()")[0]
  35. address = tr.path("./td[4]/text()")[0]
  36. pubtime = tr.path("./td[5]/text()")[0]
  37. position={
  38. 'url': fullurl,
  39. 'title': title,
  40. 'category': category,
  41. 'nums':nums,
  42. 'address': address,
  43. 'pubtime': pubtime
  44. }

总结:

本文详细介绍了lxml库的使用方法,包括解析HTML和XML文档、XPath定位、数据提取、元素修改和删除、处理命名空间、解析大型文档等。lxml是一款功能强大且高效的网络爬虫工具,可以帮助你轻松地进行数据采集和信息提取。希望本文对你理解和应用lxml有所帮助!

注意:本文代码示例仅作为参考,实际应用时请根据具体需求进行修改和优化。祝你在网络爬虫的道路上取得成功!

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

闽ICP备14008679号