Python lxml库解析HTML网页文件实战指南

Cora
Cora
发布时间:2026-10-13| 6人浏览过
原创

本文详细介绍Python中lxml库解析HTML文件的方法。涵盖DOM节点创建与属性获取、XPath绝对与相对路径筛选、文本提取及Scrapy爬虫实战示例。重点强调UTF-8解码必要性及常见解析错误处理,帮助开发者高效处理网页数据。

lxml库概述与前置注意事项

本示例演示了如何在Python大数据处理中使用lxml库解析HTML网页文件,供读者参考学习。

lxml是Python中用于解析HTML和XML并构建DOM树的库,具有功能强大且性能优异的特点。它内部集成了ElementTree、html5lib和BeautifulSoup等库的功能。

使用lxml前需特别注意:必须确保HTML内容已进行UTF-8解码,即执行code =html.decode('utf-8', 'ignore')。若未解码,中文编码后的形式如'/u2541'会导致lxml将反斜杠误判为标签结束符,从而引发解析错误。

DOM节点基本操作

以下是lxml的具体用法,主要涉及元素节点的操作。

第一步是解析HTML以建立DOM树。


from lxml import etree
dom = etree.HTML(html)

第二步,查看DOM中子元素的数量,可通过len(dom)实现。

第三步,查看特定节点的内容,使用etree.tostring(dom[0])。

第四步,获取节点的标签名称,使用dom[0].tag。

第五步,获取某节点的父节点,使用dom[0].getparent()。

第六步,获取某节点的属性节点内容,使用dom[0].get("属性名称")。

XPath路径语言与筛选技巧

lxml对XPath路径提供了良好支持。

XPath即XML路径语言,采用类似目录树的结构描述XML文档中的路径,使用'/'作为层级分隔符。第一个'/'代表文档根节点(指文档本身,而非最外层标签)。例如,对于HTML文件,最外层节点通常表示为'/html'。

XPath选取元素主要有两种方式。

第一种是绝对路径,例如page.xpath("/html/body/p"),该路径会定位到body节点下的所有p标签。

第二种是相对路径,例如page.xpath("//p"),该路径会查找整个HTML代码中的所有p标签。

XPath的筛选方式包括以下几种。

选取元素时返回一个列表,可通过索引[n]进行查找。

可通过属性值筛选元素,例如p =page.xpath("//p[@style='font-size:200%']")。

若无属性,可通过text()获取元素文本、position()获取元素位置或last()进行筛选。

属性与文本提取示例

以下是获取属性值的示例。


dom.xpath(.//a/@href)

以下是获取文本的示例。


dom.xpath(".//a/text()")

Scrapy爬虫完整示例

完整示例代码如下。


#!/usr/bin/python
# -*- coding:utf-8 -*-
from scrapy.spiders import Spider
from lxml import etree
from jredu.items import JreduItem
class JreduSpider(Spider):
  name = 'tt' #爬虫的名字,必须的,唯一的
  allowed_domains = ['sohu.com']
  start_urls = [
    'http://www.sohu.com'
  ]
  def parse(self, response):
    content = response.body.decode('utf-8')
    dom = etree.HTML(content)
    for ul in dom.xpath("//div[@class='focus-news-box']/div[@class='list16']/ul"):
      lis = ul.xpath("./li")
      for li in lis:
        item = JreduItem() #定义对象
        if ul.index(li) == 0:
          strong = li.xpath("./a/strong/text()")
          li.xpath("./a/@href")
          item['title']= strong[0]
          item['href'] = li.xpath("./a/@href")[0]
        else:
          la = li.xpath("./a[last()]/text()")
          item['title'] = la[0]
          item['href'] = li.xpath("./a[last()]/href")[0]
        yield item

如需了解更多Python相关内容,可查阅本站《Python Socket编程技巧总结》、《Python正则表达式用法总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》等专题。

希望本文所述内容对大家的Python程序设计有所帮助。

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。