xml语言与html,XML与HTML的分析处理
一、python處理XML
XML指可擴(kuò)展標(biāo)記語(yǔ)言(eXtensible Markup Language)。XML被設(shè)計(jì)用來傳輸和存儲(chǔ)數(shù)據(jù)。XML是一套定義語(yǔ)義標(biāo)記的規(guī)則,這些標(biāo)記將文檔分成許多部件并對(duì)這些部件加以標(biāo)識(shí)。它也是元標(biāo)記語(yǔ)言,即定義了用于定義其他與特定領(lǐng)域有關(guān)的、語(yǔ)義的、結(jié)構(gòu)化的標(biāo)記語(yǔ)言的句法語(yǔ)言。
Python對(duì)XML的解析:常見的XML編程接口有DOM和SAX,這兩種接口處理XML文件的方式不同,當(dāng)然使用場(chǎng)合也不同。
1.SAX (simple API for XML )
python標(biāo)準(zhǔn)庫(kù)包含SAX解析器,SAX用事件驅(qū)動(dòng)模型,通過在解析XML的過程中觸發(fā)一個(gè)個(gè)的事件并調(diào)用用戶定義的回調(diào)函數(shù)來處理XML文件。
2.DOM(Document Object Model)
將XML數(shù)據(jù)在內(nèi)存中解析成一個(gè)樹,通過對(duì)樹的操作來操作XML。
注:因DOM需要將XML數(shù)據(jù)映射到內(nèi)存中的樹,一是比較慢,二是比較耗內(nèi)存,而SAX流式讀取XML文件,比較快,占用內(nèi)存少,但需要用戶實(shí)現(xiàn)回調(diào)函數(shù)(handler)。
例:
cat book.xml<?xml ?version="1.0"?encoding="ISO-8859-1"?>
Harry?Potter29.99
Learning?XML39.95
使用python處理的相關(guān)代碼如下: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())
抓取全國(guó)各省郵編的實(shí)例:
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的一個(gè)小例子: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類。工作的流程是:當(dāng)feed給它一個(gè)類似HTML格式的字符串時(shí),它會(huì)調(diào)用goahead方法向前迭代各個(gè)標(biāo)簽,并調(diào)用對(duì)應(yīng)的parse_xxxx方法提取start_tag, tag, data, comment?和end_tag?等標(biāo)簽信息和數(shù)據(jù),然后調(diào)用對(duì)應(yīng)的方法對(duì)這些抽取出來的內(nèi)容進(jìn)行處理
handle_startendtag? #處理開始標(biāo)簽和結(jié)束標(biāo)簽
handle_starttag ? ? ? #處理開始標(biāo)簽,比如
handle_endtag ? ? ? ?#處理結(jié)束標(biāo)簽,比如或者
handle_charref? ? ? ? #處理特殊字符串,就是以開頭的,一般是內(nèi)碼表示的字符
handle_entityref? ? ? #處理一些特殊字符,以&開頭的,比如 ?
handle_data ? ? ? ? ? #處理data中間的那些數(shù)據(jù)
handle_comment? ? #處理注釋
handle_decl ? ? ? ? ? #處理
handle_pi ? ? ? ? ? ? ?#處理形如<?instruction>的
markupbase安裝方法: 直接'pip install'無法安裝成功,嘗試命令'pip search markupbase'得到包名'micropython-markupbase’,然后直接在網(wǎng)頁(yè)上下載這個(gè)包,下載后里面有一個(gè)'_markupbase.py'文件,將文件名前綴去掉后文件復(fù)制到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):
"""一個(gè)簡(jiǎn)單的HTMLparser的例子"""
def?handle_decl(self,?decl):
"""處理頭文檔"""
HTMLParser.handle_decl(self,?decl)
print(decl)
def?handle_starttag(self,?tag,?attrs):
"""處理起始標(biāo)簽"""
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):
"""處理結(jié)束標(biāo)簽"""
HTMLParser.handle_endtag(self,?tag)
if?not?HTMLParser.get_starttag_text(self).endswith("/>"):
print(""+tag+">")
def?handle_startendtag(self,?tag,?attrs):
"""處理自閉標(biāo)簽"""
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()
總結(jié)
以上是生活随笔為你收集整理的xml语言与html,XML与HTML的分析处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米 Redmi Watch 3 手表全
- 下一篇: 2017年html5行业报告,云适配发布