用python解析html

本文介绍了Python中用于解析HTML文本的三个库:HTMLParser、sgmllib和htmllib。通过示例展示了如何使用HTMLParser和sgmllib处理HTML标签和数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib。他们的实现方法不通,但功能差不多。这三个库中提供解析html的类都是基类,本身并不做具体的工作。他们在发现的元件后(如标签、注释、声名等),会调用相应的函数,这些函数必须重载,因为基类中不作处理。

 

比如:

"""<html><head><title>Advice</title></head><body>
<p>The <a href="http://ietf.org">IETF admonishes:
<i>Be strict in what you <b>send</b>.</i></a></p>
<form>
<input type=submit >  <input type=text name=start size=4></form>
</body></html>
"""

 

如果对这个数据做处理,当检测到<html>标签时,对于HTMLParser,会调用handle_starttag函数。

 

 

下面具体介绍下几个库

1、HTMLParser

此函数的输出:

/html/body/p >> The
/html/body/p/a >> IETF admonishes:
/html/body/p/a/i >> Be strict in what you
/html/body/p/a/i/b >> send
/html/body/p/a/i >> .

对于一些网页,可能并没有严格的开始结束标签对,这时,我们可以去忽略一些标签。可以自己写个堆栈来处理这些标签。

 

 

HTMLParser有个bug,就是不能处理中文属性,比如说,如果网页里有这么一段:

<input type=submit value=跳转到>

那么解析到这一行时就会出错。


错误原因还是正则表达式惹的祸。
 
attrfind = re.compile(
    r'/s*([a-zA-Z_][-.:a-zA-Z_0-9]*)(/s*=/s*'
    r'(/'[^/']*/'|"[^"]*"|[-a-zA-Z0-9./,:;+*%?!&$/(/)_#=~@]*))?')
attrfind 没有匹配中文字符。

可以更改这个匹配已修正这个错误。sgmllib则不存在这种错误。

 

2、sgmllib


html格式为sgml格式的一个子集,所以sgml可以处理跟多的东西,下面通过一段代码来示例sgmllib的用法。

 

 输出:


start tag:<head>
start tag:<title>
/lala >> Advice
end tag:</title>
end tag:</head>
start tag:<body>
start tag:<p>
/lala >> The
start tag:<a>
/lala >> IETF admonishes:
start tag:<i>
/lala >> Be strict in what you
start tag:<b>
/lala >> send
end tag:</b>
/lala >> .
end tag:</i>
end tag:</a>
end tag:</p>
start tag:<form>
start tag:<input>
/lala >> ϒ
start tag:<input>
end tag:</form>
end tag:</body>
end tag:</lala>

 

和HTMLParser一样,如果要用sgmllib解析html,则要继承sgmllib.SGMLParser类,此类里的函数都是空的,用户需要重载它。这个类提供的功能是在特定情况下调用相应的函数。

比如当发现<html>标签时,如果并没有定义 start_html(self,attr)函数,则会调用unknown_starttag函数,具体怎么处理则更具用户。

sgml的标签是可以自定义的,比如自己定义了一个start_lala函数,则就会处理<lala>标签。

 

有个地方要说明下,如果定义了start_tagname函数,有定义了handle_starttag函数,则函数只会运行handle_starttag函数,start_tagname为空函数都没有问题,如果没有定义handle_starttag函数,则遇到<tagname>标签时,会运行start_tagname函数。如果没有定义tagname的start函数,则此标签为未知标签,调用unknown_starttag函数

 

 

### 解析HTML文件的方法 在Python中,解析HTML文件可以借助多种工具和库来完成。以下是关于如何使用 `BeautifulSoup` 或 `lxml` 来实现这一目标的具体说明。 #### BeautifulSoup 的基本用法 `BeautifulSoup` 是一种强大的 Python 库,专门设计用于从 HTML 和 XML 文件中提取数据[^4]。通过该库,开发者能够轻松构建解析树,并从中抽取所需的信息。要开始使用 `BeautifulSoup`,首先需要将其导入到项目中[^1]: ```python from bs4 import BeautifulSoup ``` 接着可以通过读取本地 HTML 文件或者网络请求返回的内容来进行解析。例如,假设有一个名为 `example.html` 的文件,则可以用如下方式加载并解析它: ```python with open('example.html', 'r') as file: content = file.read() soup = BeautifulSoup(content, 'lxml') print(soup.prettify()) ``` 这里选择了 `'lxml'` 作为解析器,因为相比其他选项(如默认的纯 Python 实现),它的性能更优[^2]。 #### lxml 的特点及其应用 尽管 `BeautifulSoup` 提供了友好的接口以便于操作 DOM 结构,但在某些情况下可能效率不足。此时可考虑直接采用底层支持更高的解决方案——即 `lxml` 库。由于其核心部分由 C 编写而成,因此执行速度显著优于前者。下面展示了一段简单的例子用来演示如何利用 `lxml` 进行类似的文档分析工作流程: ```python from lxml import etree tree = etree.parse('example.html') for element in tree.iter(): print(f"{element.tag}: {element.text}") ``` 值得注意的是,在实际应用场景下往往还需要结合 CSS Selectors 或 XPath 表达式进一步精确定位节点位置[^3]。 综上所述,虽然两者都能很好地满足大多数需求场景下的 HTML 处理任务;但如果追求极致效能的话,则推荐优先选用后者单独部署方案而非嵌套调用模式。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值