第7章 解析HTML和XHTML

理解基本的HTML解析

在用HTMLParser模块解析之前,一般需要定义一个子类HTMLParser.HTMLParser,并添加用来处理不同标签的函数。例子:

#!/usr/bin/env python
#-*-coding:utf-8-*-

import sys
from HTMLParser import HTMLParser

class TitleParser(HTMLParser):
    def __init__(self):
        self.title=‘‘
        self.readingtitle=0
        HTMLParser.__init__(self)#初始化和重置实例
    
    def handle_starttag(self,tag,attrs):
        if tag==‘title‘:
            self.readingtitle=1

    def handle_data(self,data):
        if self.readingtitle:
            self.title+=data

    def handle_endtag(self,tag):
        if tag==‘title‘:
            self.readingtitle=0
    
    def gettitle(self):
        return self.title

fd=open(sys.argv[1])
tp=TitleParser()
tp.feed(fd.read())
print ‘Title is:‘,tp.gettitle()
tp.close()

HTMLParser的feed()方法会适当地调用handle_starttag()、handle_data()和handle_endtag()方法。按照我的理解,HTMLParser会解析html文档中的每一层,若遇到的是<...>,则将括号内的内容交给handle_starttag()处理,若是</...>,则交给handle_endtag()处理,若是两者之间的,则交给handle_data()处理。

除此以外,真是的html中会有实体。实体表示正规的字符,例如:&amp;表示“&”。对于实体的处理会调用handle_entityref()方法。除了实体外,还有字符参考,看上去类似&#174;这样的字符参考是用来嵌入那些不能打印的字符的。对于字符参考的处理会调用handle_charref()函数处理。

对于HTML代码来说,一个令人讨厌的问题是不均衡的标签。因为在HTML中,有些标签是不要求结束的。而XHTML要求左右的标签必须有结束部分。mxTidy和uTidylib库可以用来自动修复写得不号的HTML代码。例子:

<HTML>
<HEAD>
<TITLE>Document Title &amp; Intro®
</HEAD>
<BODY>
This is my text.
<UL>
<LI>First list item
<LI>Second list item</LI>
<LI>Third list item
</BODY>
</HTML>
#!/usr/bin/env python

from htmlentitydefs import entitydefs
from HTMLParser import HTMLParser
import sys,re

class TitleParser(HTMLParser):
    def __init__(self):
        self.taglevels=[]
        self.handledtags=[‘title‘,‘ul‘,‘li‘]
        self.processing=None
        HTMLParser.__init__(self)
    
    def handle_starttag(self,tag,attrs):
        if len(self.taglevels) and self.taglevels[-1]==tag:
            #Processing a previous version of this tag.Close it out 
            #and then start a new on this one
            self.handle_endtag(tag)
    
        #Note that we‘re now processing this tag
        self.taglevels.append(tag)
        
        if tag in self.handledtags:
            self.data=‘‘
            self.processing=tag
            if tag==‘ul‘:
                print ‘List started.‘
    def handle_data(self,data):
        if self.processing:
            self.data+=data
    
    def handle_endtag(self,tag):
        if not tag in self.taglevels:
            return
        while len(self.taglevels):
            starttag=self.taglevels.pop()

            if starttag in self.handledtags:
                self.finishprocessing(starttag)
            if starttag==tag:
                break
    def cleanse(self):
        self.data=re.sub(‘\s+‘,‘ ‘,self.data)

    def finishprocessing(self,tag):
        self.cleanse()
        if tag==‘title‘ and tag==self.processing:
            print ‘Document Title:‘,self.data
        elif tag==‘ul‘:
            print ‘List ended.‘
        elif tag==‘li‘ and tag==self.processing:
            print ‘List item:‘,self.data

        self.processing=None

    def handle_entityref(self,name):
        if entitydefs.has_key(name):
            self.handle_data(entitydefs[name])
        else:
            self.handle_data(‘&‘+name+‘;‘)
    
    def handle_charref(self,name):
        try:
            charnum=int(name)
        except ValueError:
            return

        if charnum<1 or charnum>255:
            return

        self.handle_data(chr(charnum))
    
    def gettitle(self):
        return self.title

fd=open(sys.argv[1])
tp=TitleParser()
tp.feed(fd.read())

在handle_starttag()函数中,无论何时只要出现了一个开始标签,系统就会在self.taglevels中记录下来。若标签是程序处理的三种之一,也会在self.processing设置标记来通知系统开始记录数据。在handle_endtag()中,首先检查在查询中是否存在一个和结束标签对应的起始标签。若没有就会略过。若有就会找到最近的哪个。self.finishprocessing()函数会去掉数据字符串中的空格,并打印除合适的消息。tag==self.processing确保相同的数据不会被使用两次。

时间: 2024-09-30 19:05:17

第7章 解析HTML和XHTML的相关文章

HTML与CSS入门——第三章 理解HTML和XHTML的关系

知识点: 1.以HTML创建一个简单网页的方法 2.包含每个网页必须有的所有HTML标签的方法 3.用段落和换行组织页面的方法 4.用标题组织内容的方法 5.HTML.XML.XHTML和HTML5之间的差别 3.1 从一个简单的网页开始: 作者建议:从简单的文本编辑器开始学习,之后再转向可视化工具. 扩展名支持:.htm以及.html 如.jsp,.asp,.php之类的文件类型使用超出了HTML范围的服务器端技术,需要专门的服务端支持.比如Apache服务器 3.2 每个XHMTL网页必须有

第十三章 解析文本

第十三章解析文本 结构化的文本格式,对我和机器来说,都具有可读性,在计算机界几乎从开始就流行,编程语言就是一个很好的示例,当然还有其他许多应用.解析文本,与前面一章"面向语言编程"是相关联的,因为,如果想要实现一种语言,不嵌入在 F# 中,那么,第一步就是要为这种格式创建解析器.然而,解析已有文本格式是有许多原因的,因此,,没有把它限制在解析语言这一章中.[ 也是这一章从原来第十二章中分出来的原因] 简单的文本格式,比如逗号分隔(comma separated values,CSV)格

PYTHON网络编程基础 pdf扫描版高清下载

PYTHON网络编程基础 pdf,本书全面介绍了使用PYTHON进行网络编程的基础知识,高级网络操作.WebServices.解析HTML和XHTML.XML.FTP.使用PYTHON操作数据库.SSL.几种服务器端框架,以及多任务处理等,实用性比较强,书中提供了175个实例,6600行以上的代码. 目录 第1部分 底层网络 第1章 客户/服务器网络介绍 第2章 网络客户端 第3章 网络服务器 第4章 域名系统 第5章 域名系统 第2部分 Web Service 第6章 Web客户端访问 第7章

第六章、epub文件处理 -- 解析container文件与.opf文件

第六章.epub文件处理 -- 解析container文件与.opf文件 这一章我们会接着第三章结尾介绍的FBReaderApp类的openBookInternal继续,开始介绍解析container文件与.opf文件. 这一章中会涉及到第二章.第四章.第五章中介绍的内容,大家可以互相参照,加深理解 首先,我们来回顾下第四章"epub文件处理 -- epub文件内部组成"的内容.我们在第四章中曾经介绍过,epub文内部包含的文件包括"container.xml文件..opf文

ASP.NET 动态查找数据 并且生成xml文档 同时使用xslt转换为xhtml

前言 xsl是一门标签解析语言,很适合做动态网页的前台标签 www.bamn.cn 1 首先是aspx页面 添加一个输入框 按钮 还有一个用来显示解析后的xhtml代码的控件 <form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server" TextMode="MultiLine"

HTML/XHTML入门到项目开发视频教程

第1章(1课时)--1.XHTML学前准备 第2章(2课时)--2.HTML基本结构 第3章(3课时)--3.排列清单控制标记 第4章(4-5课时)--4.表格(上) 5.表格(下) 第5章(6课时)--6.图像 第6章(7课时)--7.超链接 第7章(8课时)--8.表单 第8章(9课时)--9.框架 第9章(10课时)--10.多媒体 第10章(11课时)--11. 其他标记 第11章(12-13课时)--项目实战 --河畔林语 第12章(14课时)--XML与XHTML 第13章(15课时

XHTML教程 首页

XHTML 教程 XHTML 是更严谨更纯净的 HTML 版本. 在此教程中,我们会为您讲解 HTML 与 XHTML 之间的差异,同时也会为您展示将该站点升级到 XHTML 的方法. 开始学习 XHTML! XHTML 参考手册 我们的 XHTML 参考手册是一个按字母顺序排列的 XHTML 标签列表,其中配合了相当多的实例和注释. XHTML 1.0 参考手册 内容列表 XHTML 简介 此章节对 XHTML 进行了简要的介绍,并解释了 XHTML 的概念. XHTML - Why? 这章解

Python网络编程基础笔记

第一部分:底层网络 第一章:客户/服务器网络介绍 1.1 理解TCP基础 TCP/IP事实上是一些协议的合集.当前大多数使用中的通信都使用TCP协议. 为了实现共享,TCP是通过把您要发送的数据流分解成很多小信息包在Internet上传输的(也许还伴有其他程序的信息包),而这些信息包到了接收者的地方会再次重新合成在一起. Internet连接就会用很少的时间来发送数据的每一个比特(bit),而其他程序的信息包也可以同时被传送. 1.1.1 寻址 第二章:网络客户端 第三章:网络服务器 第四章:域

[转帖]浏览器工作原理

浏览器工作原理详解 原贴地址不详 .. 这篇文章是以色列开发人员塔利·加希尔的研究成果.她在查阅了所有公开发布的关于浏览器内部机制的数据,并花了很多时间来研读网络浏览器的源代码.她写道: 在 IE 占据 90%市场份额的年代,我们除了把浏览器当成一个“黑箱”,什么也做不了.但是现在,开放源代码的浏览器拥有了过半的市场份额,因此,是时候来揭开神秘的面纱,一探网络浏览器的内幕了.呃,里面只有数以百万行计的C++ 代码… 本篇文章的英文原版:How Browsers Work: Behind the