1. 程式人生 > 實用技巧 >lxml.etree.HTML(),lxml.etree.fromstring()和lxml.etree.tostring()三者的區別與聯絡

lxml.etree.HTML(),lxml.etree.fromstring()和lxml.etree.tostring()三者的區別與聯絡

在學習xpath()的過程中,除了學習xpath的基本語法外,我們最先遇到的往往是文件的格式化問題!因為只有正確格式化之後的文件,才能準確利用xpath尋找其中的關鍵資訊。

對於文件格式化的問題,可能不同的人,會遇到不一樣的情況,但是基本上只要搞懂了lxml.etree.HTML(),lxml.etree.fromstring()和lxml.etree.tostring()這三者之間的區別和聯絡,那麼文件格式化這一步一定不會有問題!

表格解讀:
1.從三者的型別上可以看到,etree.HTML()和etree.fromstring()都是屬於同一種“class類”,這個型別才會支援使用xpath。也就說etree.tostring()是“位元組bytes類”,不能使用xpath!

2.從根節點看,etree.HTML()的文件格式已經變成html型別,所以根節點自然就是html標籤【這屬於html方面的知識點,不清楚的朋友可以查資料瞭解】
但是,etree.fromstring()的根節點還是原文件中的根節點,說明這種格式化方式並不改變原文件的整體結構,我比較推薦使用這種方式進行文件格式化,因為這樣有利於我們有時使用xpath的絕對路徑方式查詢資訊!
而etree.tostring()是沒有所謂的根節點的,因為這個方法得到的文件型別是‘bytes’類,其實裡面的tostring,我們可以理解成to_bytes,這樣可以幫助理解記憶。

3.從編碼方式上看,etree.HTML()和etree.fromstring()的括號內參數都要以“utf-8”的方式進行編碼!表格中的X是表示用read()方法之後的原文件內容。

為了便於大家理解,我下面舉個例項:

import lxml.etree as le
with open(‘books.xml’,’r’,encoding=‘utf-8’) as b:
    contents=b.read()
    contents_html=le.HTML(contents.encode(‘utf-8’))
    co_ht_xpath=contents_html.xpath(‘/*’)
    print(co_ht_xpath)

上面這段程式碼是典型的使用xpath()方法查詢網頁內容的步驟,表格中所寫的X就是上面程式碼中的contents,這裡的contents本質上是一個包含books.xml文件內所有內容的長字串。

由於這個長字串裡,往往含有各種特殊符號或中文漢字等,所以必須對這個長字串contents以‘utf-8’方式進行編碼,那麼才不會因無法識別而出現亂碼的情況。如果這裡沒有用encode(‘utf-8’)進行編碼,那麼使用etree.HTML()和etree.fromstring()時,程式都會報錯!