python模組系列 一 之文件解析利器lxml

2021-07-23 16:19:54 字數 3211 閱讀 8341

引言:

lxml是基於xpath語法的,也就是說如果你掌握了xpath語法,那麼對於你學習其他工具解析文件都是很容易的事。比如前面我們介紹的scrapy框架就是採用xpath語法進行文件解析。廢話不多說,直入主題。

一.lxml安裝步驟

1.安裝python(這裡就不具體闡述了,見我之前文章)

二.xpath語法詳解(耐心看完,不一定全部記住,便於以後隨時查詢)

xpath是一門在xml文件中查詢資訊的語言,可用於查詢元素和屬性。

1.選取節點

xpath使用路徑表示式在xml文件中選取節點,節點是通過沿著路徑或者step來選取的。

下面列出了最常用的路徑表示式

表示式描述

例項解釋

/從根節點出發開始定位

xpath(「/a」)

選擇根節點下的所有a

//從任意節點出發開始定位

xpath(「//a」)

選擇所有的a節點

.從當前節點出發開始定位

xpath(「./a」)

選擇當前節點下的所有a節點

..從當前節點的父節點出發開始定位

xpath(「../a」)

選擇父節點下的所有a節點

@選擇節點的屬性

xpath(「./a/@href」)

選擇當前節點下a標籤的href屬性

text()

選擇節點的text文字

xpath(「./a/text()」)

選擇a節點的text文字

:當xpath的路徑以/開頭時,表示讓xpath解析引擎從文件的根節點開始解析。當xpath路徑以//開頭時,則表示讓xpath引擎從文件的任意符合的元素節點開始進行解析。而當/出現在xpath路徑中時,則表示尋找父節點的直接子節點,當//出現在xpath路徑中時,表示尋找父節點下任意符合條件的子節點,不管巢狀了多少層級

2.謂語

謂語被嵌在方括號內,用來查詢某個特定的節點或包含某個指定的值的節點

表示式描述

例項解釋

[n]選擇某節點的第n(n>=1)個子節點

xpath(「//h//a[1]」)

選擇h節點下第1個a節點

[last()]

選擇某節點的最後乙個子節點

xpath(「//h//a[last()]」)

選擇h節點下最後乙個a節點

[@attribute]

選擇節點帶有attribute屬性的節點

xpath(「//img[@src]」)

選擇帶有src屬性的img節點

[@attribute=value]

選擇帶有attribute屬性值的節點

選擇href屬性值為aaa.jpg的a節點

*任意匹配元素或者屬性xpath(「//a/「),xpath(「//a[@]」)

選擇a節點下的所有子節點,選擇帶有屬性的a節點

3.模糊搜尋與匹配(應對複雜情況,特別有用)函式

用法解釋

starts-with

xpath(「//div[starts-with(@id,』user』)]」)

選擇id值以user開頭的div節點

contains

xpath(「//div[contains(@id,』user』)]」)

選擇id值包含user的div節點

andxpath(「//div[starts-with(@class,」login」) and contains(@id,』user』)]」)

選擇class值以login開頭和id值包括user的div節點

text()

xpath(「//div[starts-with(text(),」mytest」)]」)

選取節點文字包含myest的div節點

4.xpath軸

查詢當前節點的父子,兄弟等節點時,需要用到xpath軸

軸名稱表示式

描述ancestor

xpath(「./ancestor::*」)

選取當前節點的所有父輩節點

ancestor-or.self

xpath(「./ancestor-or-self::*」)

選取當前節點的父輩節點和節點自身

child

xpath(「./child::*」)

選擇當前節點的所有子節點

descendant

xpath(「./descendant::*」)

選擇當前節點的所有後代節點(子節點、孫節點等)

follow

xpath(「./following::*」)

選取當前節點結束標籤後的所有節點

follow-sibling

xpath(「./follow-sibling::*」)

選取當前節點之後的兄弟節點

preceding

xpath(「./preceding::*」)

選取當前開始標籤前的所有節點

三.lxml實戰

提取出人人網使用者頁面的暱稱資訊(需要先實現模擬登入功能,見我前面的文章)

from lxml import etree

import requests

renrenurl=""

resp=equests.get(renrenurl)

html=etree.html(resp.content)

#將列表中的元素逐個用引號連線成字串

name="".join(html.xpath("//title/text()"))

index=name.find("-")

ifindex!=-1:

username=name[index+1:]

print("username-->%s"

%username)

四. 感悟

實戰中的例子比較簡單,**不重要,重要的是思路和方法。我們不可能將所有

用法都列舉,我們也不可能將所有的**和用法都記住。只要有思路和方法,以後再遇到此類問題就會覺得輕鬆了。

python文件模組 Python模組介紹

模組就是乙個python檔案 一 python模組分為三種型別 1.標準模組 python自帶的 random datetime string json 2.第三方模組 3.自己寫的模組 自己寫的模組中,若有部分 不想讓別人匯入,則可以使用if name main 將不想讓別人匯入的 寫到if條件下...

python系列之numpy模組學習

未完待續 1.nupmy是什麼?numpy是python中用於科學計算的乙個庫。import numpy as np 匯入numpy並命名為np print np.version.version 輸出numpy的版本 print np.version 也可以這樣輸出版本 結果如圖 2.建立陣列 ar...

python學習之模組 模組 一

把一些常用的函式放在乙個py檔案中,這個檔案就稱之為模組。1.方便管理。讓程式的解構更加清晰,實現功能的重複使用 2.提公升開發效率。俗話說的拿來主義,避免重複造輪子,使用別人寫好的實現了某些功能的模組,可以大大提高開發效率。第一類 內建模組,也叫做標準庫。python自帶,200多個,每個模組又包...