Python lxml库解析HTML网页文件实战指南
本文详细介绍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程序设计有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









