XML與HTML的分析處理
一、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"?> <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 #處理一些特殊字符,以&開頭的,比如
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的分析處理