XML与HTML的分析处理-阿里云开发者社区

开发者社区> 余二五> 正文

XML与HTML的分析处理

简介:
+关注继续查看

一、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())

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

ebbe7c5dabe92e4b624f60f5e9d8e107.jpg

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,如需转载请自行联系原作者

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Python系列直播——深入Python与日志服务,玩转大规模数据分析处理实战
Python系列直播——深入Python与日志服务,玩转大规模数据分析处理实战
4842 0
玩转大数据系列之二:数据分析与处理
经过了数据采集和同步之后,就可以在阿里云上进行数据分析和处理,来玩转您的数据了。本文向您介绍在阿里云大数据各产品中,以及各产品之间怎样来完成您的数据处理和数据分析。
10591 0
Web系统下Office文档的处理 之OpenXml应用分类资料
本文对常见的处理参考和工具提供一个简要的参考。 对于实际的解决方案参考如下地址(有很多的分类知识) http://blogs.msdn.com/b/ericwhite/archive/2008/10/20/eric-white-s-blog-s-table-of-contents.
956 0
文本分析和处理 awk|学习笔记
快速学习文本分析和处理 awk
31 0
从 0 到 1 通过 Flink + Tablestore 进行大数据处理与分析
阿里云实时计算Flink版是一套基于 Apache Flink 构建的⼀站式实时大数据分析平台。在大数据场景下,实时计算 Flink 可提供端到端亚秒级实时数据流批处理能力。表格存储 Tablestore (又名 OTS)是阿里云自研的多模型结构化数据存储,可提供海量结构化数据的存储、查询分析服务。表格存储的双引擎架构支持千万TPS和毫秒级延迟的服务能力,可作为大数据计算的极佳上下游存储。
336 0
基于对象存储 OSS 的智能数据分析处理框架和功能
今年参加了 2019 全球闪存峰会(Flash Memory World),分享了“基于云存储的智能数据分析处理架构”,重点介绍在对象存储 OSS 之上的数据处理功能,现整理相关内容和大家探讨。
2129 0
+关注
20382
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载