xml语言与html,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"?>
Harry?Potter29.99
Learning?XML39.95
使用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("")
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('')
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的一個小例子: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 ? ? ? #處理開始標簽,比如
handle_endtag ? ? ? ?#處理結束標簽,比如或者
handle_charref? ? ? ? #處理特殊字符串,就是以開頭的,一般是內碼表示的字符
handle_entityref? ? ? #處理一些特殊字符,以&開頭的,比如 ?
handle_data ? ? ? ? ? #處理data中間的那些數據
handle_comment? ? #處理注釋
handle_decl ? ? ? ? ? #處理
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("")
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()
總結
以上是生活随笔為你收集整理的xml语言与html,XML与HTML的分析处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小米 Redmi Watch 3 手表全
- 下一篇: 宝马 i Vision Dee 概念车将