1. 程式人生 > >XML與HTML的分析處理

XML與HTML的分析處理

sax dom htmlparser

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

<?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處理的相關代碼如下:

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

抓取全國各省郵編的實例:

技術分享

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的一個小例子:

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

#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()


本文出自 “WorkNote” 博客,請務必保留此出處http://caiyuanji.blog.51cto.com/11462293/1981977

XML與HTML的分析處理