在學習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()時,程序都會報錯!