Python學習筆記 12 10章 XML

2021-08-28 08:17:57 字數 3474 閱讀 7771

1、概覽

xml雖然比json複雜,在web中應用也不如以前多了,不過仍有很多地方在用,所以,有必要了解如何操作xml。1、

dom vs sax

操作xml有兩種方法:dom和sax。dom會把整個xml讀入記憶體,解析為樹,因此占用記憶體大,解析慢,優點是可以任意遍歷樹的節點。sax是流模式,邊讀邊解析,占用記憶體小,解析快,缺點是我們需要自己處理事件。

正常情況下,優先考慮sax,因為dom實在太佔記憶體。

2、使用

sax解析

xml 在python中使用sax解析xml非常簡潔,通常我們關心的事件是start_element,end_element和char_data,準備好這3個函式,然後就可以解析xml了。

當sax解析器讀到乙個節點時:

python

會產生3個事件:

from xml.parsers.expat import parsercreate

# parsercreate

是個method

,可以呼叫它建立類,用來解析

xml

class defaultsaxhandler(object):

def start_element(self, name, attrs):

# 開始事件

print('sax:start_element: %s, attrs: %s' % (name, str(attrs)))

def end_element(self, name):

# 結束事件

print('sax:end_element: %s' % name)

def char_data(self, text):

# 資料域事件

print('sax:char_data: %s' % text)

xml = r'''<?xml version="1.0"?>

# 建立了乙個

xml結構,

'''

是多行輸入

python

ruby

'''handler = defaultsaxhandler()

# 建立例項

parser = parsercreate()

# 建立直譯器

parser.startelementhandler = handler.start_element

# 將例項的方法賦給直譯器

parser.endelementhandler = handler.end_element

parser.characterdatahandler = handler.char_data

parser.parse(xml)

#呼叫直譯器的

parse()

方法解析

xml

# 結果

sax:start_element: ol, attrs: {}

sax:char_data:

sax:char_data:

sax:start_element: li, attrs: {}

sax:start_element: a, attrs:

#<

a href="/python">,a是

tag,後面的是引數

sax:char_data: python

sax:end_element: a

sax:end_element: li

sax:char_data:

sax:char_data:

sax:start_element: li, attrs: {}

sax:start_element: a, attrs:

sax:char_data: ruby

sax:end_element: a

sax:end_element: li

sax:char_data:

sax:end_element: ol

3、快速生成

xml 最簡單也是最有效的生成xml的方法是拼接字串

l = .e

ncode('

utf-8'))

return ''.join(l)

# join()

將序列中的元素以指定的字元連線生成乙個新的字串,這裡指定的字元為空 2

、例子 1

、請利用sax編寫程式解析yahoo的xml格式的天氣預報,獲取天氣預報:

引數woeid是城市**,要查詢某個城市**,可以在weather.yahoo.com搜尋城市,瀏覽器位址列的url就包含城市**。

#解法抄自于廖雪峰老師**「vg庚庚」提交的作業。

from xml.parsers.expat import parsercreate

from urllib import request

class defaultsaxhandler(object):

def __init__(self):

# 初始化屬性

self.city = ''

self.forecast =

def start_element(self, name, attrs):

# 開始事件

if name == 'yweather:location':

如果name

匹配,取出

city

的值賦給本地

city

屬性。重點理解這步

self.city = attrs['city']

if name == 'yweather:forecast':

# name

匹配,將

key對應的值加到本地

)def par***ml(xml_str):

# print(xml_str)

handler = defaultsaxhandler()

#建立例項

parser = parsercreate()

#建立直譯器

parser.startelementhandler = handler.start_element

parser.parse(xml_str)#解析

xml print('%s weather forecast:' % handler.city)

for x in handler.forecast:

#forecast

是[{}

,{}]

結構的 print('%s:  %s  high:%0.1f°c   low:%0.1f°c' % (x['date'], x['text'], x['high'], x['low']))

return

# 測試:

url = ''

with request.urlopen(url, timeout=4) as f:

data = f.read()

result = par***ml(data.decode('utf-8'))

assert result['city'] == 'beijing'

12 10學習筆記(gg機器學習)

標籤 我們要 的真實事物 y。基本線性回歸中的y變數。特徵 用於描述資料的輸入變數 xi。基本線性回歸中的變數 樣本 資料的特定例項x0 有標籤樣本 同時包含特徵和標籤,我們使用有標籤樣本來訓練模型。無標籤樣本 包含特徵但不包含標籤,用於對新資料作出 模型 定義了特徵與標籤之間的關係,可將樣本對映到...

Python學習 生成器的學習1210

在python中,這種一邊迴圈一邊計算的機制,稱為生成器 結論 生成器本質是乙個函式,不同於函式的是它生成的是乙個物件,不執行函式內的 列表生成器 列表是直接生成數字在記憶體,可以隨時呼叫 元組顯示的型別是生成器,只儲存在記憶體中,但是只有在呼叫的時候生成 1.c x for x in range ...

Python學習筆記 20 2章 asyncio

1 概覽 asyncio 是python 3.4 版本引入的標準庫,直接內建了對非同步 io的支援 asyncio 的程式設計模型就是乙個訊息迴圈。我們從 asyncio 模組中直接獲取乙個 eventloop 的引用,然後把需要執行的協程扔到 eventloop 中執行,就實現了非同步io。1.1...