有的時候,需要把整個 HTML 節點原封不動地取下來,也就是包括節點標簽、節點內容,甚至也包括內容中的空格、各種特殊符號等等。
假設已獲取到頁面源碼,並將其保存在變量 src
中。則可有代碼如下:
from html import unescape
from lxml import etree
from lxml import html
# 先加載頁面源碼,便於后續使用 XPath 解析
root = etree.HTML(src)
# 根據 XPath 路徑提取節點
script = root.xpath('//script')[-1]
# 關鍵的一步:把整個節點轉為字符串
raw_tab = html.tostring(script)
# 此時 print(raw_tab) 會遇到中文亂碼(其實不是亂碼,是另一種編碼顯示了)的情況,需要使用 unescape
json_str = json.loads(raw_tab)
print(unescape(json_str['$meta']['cityName']))
# 如果本身不是 json 字符串,則因為 unescape 函數接收的是 bytes-like 對象,所以需要先 decode
print(unescape(raw_tab.decode()))