一、xpath相關
1.1 xpath獲取節點下的所有內容
問題描述:xpath獲取節點下的所有文本可通過“*//text()”實現,但如果想獲取節點下的內容---包括文本和標簽那就沒有直接的辦法。
處理辦法:此時可使用lxml.html.tostring()方法,將篩選出的標簽轉換為字符串。
import lxml # 沒有下邊這句直接使用lxml.html會報錯lxml沒有html,不懂什么道理 from lxml import html # xpath出來的是列表,lxml.html.tostring只能接收具體的一個標簽所以要有[0] target_lable = dom.xpath("//div[@id='target_lable_id']")[0] # all_text_in_target_label = target_label.xpath("*//text()") everything_in_target_label = lxml.html.tostring(target_lable)
參考:https://www.oschina.net/question/2806953_2214094
1.2 xpath獲取包含某種樣式的節點
問題描述:如果有多個div節點都為<div class="common1"></div>,想要獲取所有這些div節點我們可以通過dom.xpath("//div[@class='common1']")來獲取。但如果有的div為<div class="common1 special1"></div>有的div為<div class="common1 special2"></div>,此時想要獲取所有這些div節點我們xpath該如何寫呢。
處理辦法:這兩個div有共用的樣式common1,如果能通過“包含common1”的形式來篩選就能達到目的;可通過xpath的contains來實現這一效果。
dom.xpath("//div[contains(@class, 'card-header')]")
二、html實體轉義和反轉義
問題描述:python生成html時我們可能會需要進行html實體轉義,而從html頁面獲取值時可能會需要將轉義還原。網上很多要么只講反轉義,要么比較舊有些庫都廢棄了。
處理辦法:現在Python3可以使用html.escape()和html.unescape(),很方便地實現html實體轉義和反轉義。
import html # 將字符串進行html實體轉義 str_need_escape = "<test>test</test>" str_escape = html.escape(str_need_escape) # 將已進行html實體轉義還原 str_need_unescape = "<test>test</test>" str_unescape = html.unescape(str_need_unescape)