一、python处理XML

XML指可扩展标记语言(eXtensible Markup Language)。XML被设计用来传输和存储数据。XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

Python对XML的解析:常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

1.SAX (simple API for XML )

python标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

2.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

例:

cat book.xml<?xml  version="1.0" encoding="ISO-8859-1"?>

Harry Potter

29.99

Learning XML

39.95

使用python处理的相关代码如下:import string

from xml.parsers.expat import ParserCreate

class DefaultSaxHandler(object):

def start_element(self,name,attrs):

self.name=name

#print('element:%s, attrs:%s' % (name,str(attrs)))

print("")

def end_element(self,name):

#print('end element:%s' % name)

print(""+name+">")

def char_data(self,text):

if text.strip():

print("%s's text is %s" % (self.name,text))

handler = DefaultSaxHandler()

parser = ParserCreate()

parser.StartElementHandler=handler.start_element

parser.EndElementHandler=handler.end_element

parser.CharacterDataHandler=handler.char_data

with open('book.xml') as f:

parser.Parse(f.read())

抓取全国各省邮编的实例:

import requests

from xml.parsers.expat import ParserCreate

class DefaultSaxHandler(object):

def __init__(self,provinces):

self.provinces=provinces

def start_element(self,name,attrs):

if name != 'map':

name = attrs['title']

number = attrs['href']

self.provinces.append((name,number))

def end_element(self,name):

pass

def char_data(self,text):

pass

def get_province_entry(url):

content=requests.get(url).content.decode('gb2312')

start=content.find('')

end=content.find('')

content=content[start:end+len('')].strip()

#print(content)

provinces = []

handler = DefaultSaxHandler(provinces)

parser = ParserCreate()

parser.StartElementHandler = handler.start_element

parser.EndElementHandler = handler.end_element

parser.CharacterDataHandler = handler.char_data

parser.Parse(content)

return provinces

provinces=get_province_entry('http://www.ip138.com/post')

print(provinces)

DOM的一个小例子:from xml.dom import minidom

doc = minidom.parse('book.xml')

root = doc.documentElement

print(root.nodeName)

books = root.getElementsByTagName('book')

for book in books:

titles = book.getElementsByTagName('title')

prices = book.getElementsByTagName('price')

print(titles[0].childNodes[0].nodeValue + ":" + prices[0].childNodes[0].nodeValue)

二、HTMLParser

html.parser的核心是HTMLParser类。工作的流程是:当feed给它一个类似HTML格式的字符串时,它会调用goahead方法向前迭代各个标签,并调用对应的parse_xxxx方法提取start_tag, tag, data, comment 和end_tag 等标签信息和数据,然后调用对应的方法对这些抽取出来的内容进行处理

handle_startendtag  #处理开始标签和结束标签

handle_starttag       #处理开始标签,比如

handle_endtag        #处理结束标签,比如或者

handle_charref        #处理特殊字符串,就是以开头的,一般是内码表示的字符

handle_entityref      #处理一些特殊字符,以&开头的,比如

handle_data           #处理data中间的那些数据

handle_comment    #处理注释

handle_decl           #处理

handle_pi              #处理形如<?instruction>的

markupbase安装方法: 直接'pip install'无法安装成功,尝试命令'pip search markupbase'得到包名'micropython-markupbase’,然后直接在网页上下载这个包,下载后里面有一个'_markupbase.py'文件,将文件名前缀去掉后文件复制到python安装目录'\lib\site-packages'下。例:cp markupbase.py /usr/local/lib/python3.6/site-packages/

下例:处理指定的html文件#coding=utf-8

from HTMLParser import HTMLParser

class MyParser(HTMLParser):

"""一个简单的HTMLparser的例子"""

def handle_decl(self, decl):

"""处理头文档"""

HTMLParser.handle_decl(self, decl)

print(decl)

def handle_starttag(self, tag, attrs):

"""处理起始标签"""

HTMLParser.handle_starttag(self, tag, attrs)

if not HTMLParser.get_starttag_text(self).endswith("/>"):

print("")

def handle_data(self, data):

"""处理文本元素"""

HTMLParser.handle_data(self, data)

print(data)

def handle_endtag(self, tag):

"""处理结束标签"""

HTMLParser.handle_endtag(self, tag)

if not HTMLParser.get_starttag_text(self).endswith("/>"):

print(""+tag+">")

def handle_startendtag(self, tag, attrs):

"""处理自闭标签"""

HTMLParser.handle_startendtag(self, tag, attrs)

print(HTMLParser.get_starttag_text(self))

def handle_comment(self, data):

"""处理注释"""

HTMLParser.handle_comment(self, data)

print(data)

def close(self):

HTMLParser.close(self)

print("parser over")

demo=MyParser()

demo.feed(open("test.html").read())

demo.close()

xml语言与html,XML与HTML的分析处理相关推荐

  1. JAVA SE学习day14:XML语言

    XML语言 一.XML语言 1.什么是XML语言? 2.XML语言用语解决什么类型的问题? 3.xml语言常见应用 二.XML语法 (一).文档证明 (二).元素 (三).属性 (四).注释 (五). ...

  2. javaweb学习总结七(XML语言作用、语法)

    一:XML语言的概念以及作用 1:xml概念:extensible Markup language,可扩展行标记语言,因为html的语法比较混乱,不够严谨. 用html写的系统不好维护,所以w3c组织 ...

  3. XML完整教程和什么是XML语言

    reille注: XML完整教程可从我的资源上下载到,下载地址为:http://download.csdn.net/source/3465952,本人浏览了下,对于掌握XML是一本不可多得的电子书籍, ...

  4. JavaWeb学习笔记(XML语言)

    知识点总结于崔希凡+王泽(广陵散)的JavaWeb视频教程,侵权请联系删除. XML XML 简介 XML的应用 XML常见应用 XML的语法规则 文档声明 元素(标签)定义 属性定义 注释 特殊字符 ...

  5. java xml开源操作类,xml解析和操作的开源工具项目涵盖java c++ php 等语言

    XML解析器-Xerces    XML操作库-dom4j    XML文档解析器-Digester    J2ME-的XML-解析器-kXML XML解析类库-MXP1    XML解析器-LibX ...

  6. Java基础加强重温_13:XML(可拓展标记语言)、XML语法、XML约束、XML解析(Dom4j,JAXP)、Dom4j基本使用、Xpath表达式(XML路径语言)、XML解析综合案例

    摘要 Java基础加强重温_13: XML(可拓展标记语言.作用:小型数据库.框架配置文件.不同平台数据交换). XML语法(文档.标签/元素.属性.注释.转义字符.CDTA区) XML约束(DTD约 ...

  7. java提高篇(44)--XML语言

    XML语言 一.XML是什么?作用是什么? l  XML ( eXtensible Markup Language )语言是一种可扩展的标记语言.其中的可扩展是相对HTML来说的.因为XML标签没有被 ...

  8. XML语言与JSON

    关于XML语言与JSON 1.什么是XML 2.XML的作用 3.什么是XML文件 XML语法 1.XML文档声明 2.标记(元素/标签/节点) 3.一个XM文档只能有一个最外层标记(根标记) 4.标 ...

  9. XML语言介绍以及语法讲解

    XML介绍 Extensible Markup Language,可扩展标记语言. XML 不会替代 HTML,理解这一点很重要.在大多数 Web 应用程序中,XML 用于传输数据,而 HTML 用于 ...

最新文章

  1. redis安装+redis主从
  2. java 多线程的单例模式,Java多线程中的单例模式两种实现方式
  3. as_hash ruby_Ruby中带有示例的Hash.delete_if方法
  4. 清明出游,在高速上堵了16个小时。
  5. mysql常用操作指令总结
  6. Numpy中的时间类型
  7. Java 1.3 控制流程(条件语句、循环结构)
  8. php如何判断一个类是否存在,PHP利用判断类是否存在函数class_exists用法的简单示例...
  9. 创建一个超链接,点击这个超链接,显示数据库中的数据信息:MVC模式查询
  10. 显示更清晰,书写更专业:汉王手写电纸本N10发布
  11. python画图像_使用python绘制SDSS图像
  12. Padavan挂载SMB共享及编译ffmpeg
  13. 计算机科学论文生成器,软件自动生成假论文:满篇废话
  14. 4核处理器_苹果电脑便宜卖!4核i5处理器,480G固态硬盘,带刻录,13.4寸,双系统...
  15. 数组排序:声明一个整型数组并填充数据,排序,输出排序后数据,倒序输出数据。
  16. 批量删除数码照片或手机中的相机参数和个人隐私信息
  17. 盈米基金如何实现基金实时评价的百倍提速?
  18. 阅读并理解lv_demo_widgets()函数
  19. linux,ubuntu下软件的更新命令
  20. STM32+ESP8266+MQTT微信小程序SoftAP一键配网接入腾讯物联网平台

热门文章

  1. Rxjs 里 subscribeToArray 工具函数的详细分析
  2. SAP Cloud for Customer的公有云和私有云部署方式 - Public Cloud vs Private Cloud
  3. Ngrx Store实现源代码的MemoizedSelector学习笔记
  4. SAP Spartacus org unit页面的三种focus border及细节讨论
  5. SAP Spartacus 自定义 Component 的使用 - SimpleResponsiveBannerComponent
  6. SAP cross distribution chain status在Fiori应用中的draft handling
  7. Spring 基于注解(annotation)的配置之@Autowired注解
  8. JavaScript ES6对Proxy的原生支持的一个例子:开发人员学习额外的编程语言
  9. SAP UI5 Web Component的React表格控件用法
  10. 用ABAP代码实现从1累加到100