博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XML与HTML的分析处理
阅读量:6899 次
发布时间:2019-06-27

本文共 4948 字,大约阅读时间需要 16 分钟。

一、python处理XML

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

PythonXML的解析:常见的XML编程接口有DOMSAX,这两种接口处理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

1
2
3
4
5
6
7
8
9
10
11
<?
xml 
version
=
"1.0" 
encoding
=
"ISO-8859-1"
?>
<
bookstore
>
<
book
>
<
title 
lang
=
"eng"
>Harry Potter</
title
>
<
price
>29.99</
price
>
</
book
>
<
book
>
<
title 
lang
=
"eng"
>Learning XML</
title
>
<
price
>39.95</
price
>
</
book
>
</
bookstore
>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
(
"<"
+
name
+
">"
)
    
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())

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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(
'<map name="map_86" id="map_86">'
)
    
end
=
content.find(
'</map>'
)
    
content
=
content[start:end
+
len
(
'</map>'
)].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的一个小例子:

1
2
3
4
5
6
7
8
9
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       #处理开始标签,比如<xx>

handle_endtag        #处理结束标签,比如</xx>或者<……/>

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

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

handle_data           #处理<xx>data</xx>中间的那些数据

handle_comment    #处理注释

handle_decl           #处理<!开头的,比如<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"

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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#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
(
"<"
+
tag
+
">"
)
    
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()
本文转自 meteor_hy 51CTO博客,原文链接:http://blog.51cto.com/caiyuanji/1981977,如需转载请自行联系原作者
你可能感兴趣的文章
java yang模型_java 深入理解jvm内存模型 jvm学习笔记
查看>>
java 任务栏_java 如何将当前程序隐藏到任务栏(类似windows上的其他程序)
查看>>
java编写一个小学辅助软件_高分求用Java编写的一个小软件
查看>>
java 现场_面试遇到现场(我哥是李刚 java模型现场)
查看>>
java asm 书_使用ASM来书写Java代码-2(zt)续2
查看>>
java 堆栈的声明_Java 堆栈
查看>>
linux 内存管理 代码,《LINUX3.0内核源代码分析》第四章:内存管理(3)
查看>>
linux 一句话运行多,Linux运维工程师常用一句话脚本,你会几句?
查看>>
linux锁住终端会话命令,Linux终端会话实时共享(kibitz)
查看>>
夏普linux电视软件,夏普电视第三方软件安装方法,使用教程和攻略
查看>>
华为手机linux终端,华为云IoT如何让“哑”终端进化为智能终端?看完这场直播你就明白了...
查看>>
linux特殊权限管理,linux文件访问特殊权限的设置
查看>>
linux 网络编程 51cto,Linux服务器开发,2小时搞定高并发网络编程
查看>>
fork是linux函数吗,关于LINUX中的FORK函数
查看>>
红旗linux 进不去图形界面,进不了红旗Linux6.0的图形界面请高手帮忙
查看>>
linux安装中文语言命令,Centos使用yum命令安装中文语言包(fonts-chinese.noarch,m17n-db-common-cjk)...
查看>>
linux添加Qt的fontconfig,QT__qt SDK------Fontconfig-2.4.2安装 (二)
查看>>
linux 查看io调度策略,磁盘IO调度策略
查看>>
高通笔记本装linux,在华硕畅370(TP370QL)骁龙笔记本上安装Ubuntu 18.04 ARM64的方法...
查看>>
linux sysfs属性,linux-sysfs
查看>>