天天看點

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

剛才是如何去搜尋文檔樹,主要用的find系列方法可以讓你去定位要找的元素們,find找一個,find_all找一批,find_all立即傳回一個清單。

所有find系列參數都是一個原則,第一個叫name,官方稱為過濾器filter,過濾器可以寫5種形式:

1.标簽,

2.正則

3.清單,

4.true或者none

5.函數

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

函數可以做增強功能,這個函數比較簡單,經過測試,函數可以接收标簽對象,可以對标簽對象進行判斷做相應的處理,最後傳回true和false即可,有點像filter

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

如果用find系列函數定位的話可以像上面這麼做

其實find_all函數内部還提供了很多參數

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

name已經測試過了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

隻要不是前面的關鍵字都被它收集,收集之後就會做為标簽的屬性

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這個意思是隻要不是前面的關鍵字都到kwargs,找id屬性為main的标簽

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

找bg1也是一個元素

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

現在是可以通過名稱,現在試試正規表達式

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

找帶id屬性的标簽,這樣就找到所有的id,意思就是擁有id屬性的标簽有哪些

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

還有就是清單方式,套路都一樣

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

可以通過誰是誰的方式來指定是什麼樣子,正規表達式還可以裡面寫或什麼,清單也是或的意思

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

但是不支援函數,屬性不支援函數,但是正規表達式引用就夠了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

id是個單值的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這是把id值取出來

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這就是要求這兩個屬性都有,and關系

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

試試class屬性,classs是python的keyword,keyword是不允許沖突,關鍵字是不允許沖突的。是以需要價格下劃線

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

還有一個這個,也有class

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

找到class沒有問題,但是現在想要精确比對下

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

寫成title是拿到了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

highlight也拿到了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

故意少個e看是什麼方式比對

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

用正規表達式,包含一下

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡要用class_因為class是keyword

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

如果真的寫在一起,按順序寫的一樣是沒問題的,不一樣就比對不了,或者用正規表達式來解決,另外三個中的任何一個也可以

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

class是多值的,多值的任何一個都可以比對,多值要全長比對就要寫的一模一樣

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

另一個參數attrs,屬性

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這樣也拿到了,要求屬性裡有id,id=first

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這次寫class就沒有問題了,是個字元串

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

跟剛才用class方式的要一緻

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

順序不對也比對不上,跟class一緻

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這樣可以

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

說明是1個and條件

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

事實上attrs這樣的寫法也是很強大的,不用XPath也可以快速定位到元素

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

text指的是文本,一般結合字元串,正規表達式,清單,true可以完成很多功能

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

裡面傳回文本

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

傳回文本\w+,,傳回了所有标簽,是從跟 /開始的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

在p标簽找文本符合指定的正規表達式

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

p标簽有沒有内容需要過濾下,或者連結過濾下有沒有内容,或者span标簽有沒有文字,都可以通過這個方式去找,還可以把屬性attrs加進去就變成了and條件,可以組合起來,是以查詢能力很強

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

要求h開頭或者p開頭的,要求裡面必須是英文的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡很特别傳回的是tag對象

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

一個所有元素傳回的是tag對象,另一個傳回的是文本

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這是文檔類型

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

傳回的類型要關注下是否符合要求

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

還提供了一個limit,相當于給查詢結構做一個限定

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

預設是遞歸的,false的話就直接找自己目前的了,不會再遞歸進去了,一般不會修改這個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

soup.p深度優先搜尋到第一個,傳回一個tag對象,soup(‘p’)傳回一個list,這是他們的差别

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

find-all可以簡寫成第二個的樣子

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

第一個相當于find_all,第二個soup.img

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這兩個等價

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這三個是一個意思,上面兩個找到一個a,第三個是找所有的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

第一個find_all省略就是第二個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這些就是各種參數,參數配合在一起可以查找我們要的元素,這就是提供的搜尋文檔樹

搜尋文檔樹還提供 了find方法,參數幾乎和find_all一模一樣

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

find_all傳回一個清單,找不到空清單,find找到是一個元素對象,找不到就是none

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

有可能需要加try,找不到是none,none就不能get,注意抛出異常

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

CSS選擇器

css選擇器和xpath一樣必須會上面的可以不會,隻是通過上面的更加了解了元素包含什麼東西,可以用可以不用,css和xpath是用beautifulsoup4最常用的來搜尋我們要的資料的

css選擇器和jQuery一樣,用另一個方法,沒有提供css方法,提供select方法,選擇器選擇,把css大多數用的選擇器,往這裡生搬一套就可以直接用了。。

标簽名直接用,類名前加.點好,id名前加#,還有什麼直接子,相鄰兄弟選擇器

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

類選擇器

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

僞類隻支援一種,這是直接子的選擇器,相當于子标簽裡的所有p标簽

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

查找nth-of-type意思

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

雖然是僞類,但是用p來限定,要提取p的類型,類型相同的第幾個由你數字提供,第二個就變顔色了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

它的意思是參照p的類型,選第二個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

css3提供了很多這樣的僞類,但是beautifulsoup隻實作了這個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這是找divcontent下的p标簽,跟他同類型的第二個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

id選擇器

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

p标簽同時id=second

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

不管标簽,找id=bg1

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

後代選擇器

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

div下不管多少層,找p 标簽

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

找到div下div,不管多少層找p标簽

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

轉換成XPath就是//div//div//p

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

中括号屬性選擇器,這意思是div下的p标簽裡的第一個與它響鈴的标簽有沒有src

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

同一級裡有沒有img,img裡有src

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

也就是先找到div下的第一個p标簽,問直接兄弟裡有沒有src屬性的,其他兄弟裡有兩個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

屬性選擇器

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

有沒有src,src是不是等于/

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

完全比對

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

字首比對

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

src是否符合字尾

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

src是否包含

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

class是否等于它或者是其中某一個,波浪線~代表某一個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

願意用 soup提供的接口,或者css都可以

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

css選擇器應該是重點,因為這裡要用,jQuery也要用

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡用css選擇器周遊整個樹形結構找到想要的節點

這裡僞類用的很少

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡叫直接子

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

子孫選擇器,後代選擇器,這裡是任意層次的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

屬性比較多,字首字尾,包含,這是img裡的src,一般隻關心圖檔的src

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

等于其中一個可以這麼寫

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

執行一下

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

最後一個也選擇上了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

寫好一點就是加個引号

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

現在試過了兩種方式,一種是文檔的簽後搜尋,find和find_all,還有css選擇器

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

string不能包含其他東西,隻能是個文本

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

strings會疊代,将裡面進行疊代,會保留白白字元

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡面會把空白字元删除

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

text本質上是get_text

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

看下text源碼

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

all_strings 預設把空白字元也放進來,然後疊代以後拼接起來,裡面什麼都有,text代表這些文本的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

單用text,跟直接調用get_text沒什麼差別

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

單獨調用get_text等于getText

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

如果調用函數,還可以指定分隔符,指定要不要把這樣的資料拿到,還可以提供types,不想要的内容

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這是把文檔第一行也進來了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

去掉的話,我們放一個元素即可+個逗号

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

all_stirngs這邊就要通過strip來決定要不要給你strip

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

如果text這個東西,直接用text是帶空白字元的,如果要是不用就soup.div.get_text(strip=true)把空白字元去掉

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

用css選擇器也好,還是現在提供的方式,還是find_all,總之隻要找的是一個元素,我們要處理的都是一個個元素對象,我們一般都關心元素裡的文本是什麼,文本裡有空白字元,如果要去掉就需要調用get也就是get_text,在這裡傳入strip=true

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

json解析

之前的豆瓣熱門傳回的是json,好歹需要把json.loads下變成一個字典,清單,一個json對應到清單和數組是沒有問題的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

拷貝連結位址

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

現在就需要import requests 連結到外面去了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

response.text是連unicode編碼都幫你做了,把text送進來,給soup處理,現在是把标簽内容直接進來了,也可以放檔案對象來讀取

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這個文本裡就是html标簽,這就是response的正文部分

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

然後下面進行處理

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

beautifulsoup還給我們套了個标簽,是以這個時候用它分析不合适

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

可以用原生json來分析,simplejson也可以

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這個是真正的json

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

把json。loads進來就變成字典了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

找找評分大于8分的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

用map和filter其實就可以,filter過濾順便可以搞清單解析式,生成器,表達式都可以出來,有可以自己寫for循環來判斷

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

有個庫叫jsonpath

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

就是把json類似于XPath一樣來解析,但是不能用Xpath文法,重新定義了文法

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

*一切的根從$符号開始,類似jQuery,目前節點是@符号,是通配符

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

…相當于XPath的雙斜杠

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

安裝

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

官網

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡有一個XPath和jsonPAth的對比

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

他們兩個的…表達意思完全不同

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

XPath不支援切片,jsnpath支援

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

謂語

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

jsonpath()是做計算的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

xpath()是做分組

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

要看大于8分的有幾個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

套了一個大字典,裡面是一個數組,數組裡是一個對象,json格式的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

裝一下擴充,解析json的時候很多人喜歡用

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

現在拿到的資料有純html和XML的,這種就用beautifulsoup和lxml來解析,但是現在遇到json,往往不能解析,都會轉成python的資料結構來處理

直接通路是個包不能使用

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

需要包下的jsonpath

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

放入上面的subjects對象也就是loads後得到的,後面就是表達式,從/跟開始任意層次先找個title

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

$就是/根。根jQuery一樣,…代表//雙斜杠,任意層次下的title

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

rs就需要解決找到8分以上的

剛才列印的title,title和rate是兄弟關系

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

先轉換下,找到分值大于8的對象出來

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這是過濾器也就是條件

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這是剛好需要的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

官方的例子,book裡面正好是個清單,到這裡的子裡面去找條件有這個情況的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

要加字元串

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

現在已經找到大于8.0的分數,現在想要找到符合條件的title

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

找一下前10個到底有幾個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

試試切片

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

取兩個

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

根XPath一樣也是先鎖定到要的資料附近,然後看如何處理

這些資料有些是異步的,拿不到的,ajax填充過來的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

邪不壓正怎麼定位都在這裡

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

檢視源代碼,邪不壓中是找不到,也就是外面response回來的内容也是找不到的這四個字,因為邪不壓中這些資料是發起了另外的請求,通過ajax來進行通路,通路到了通過js腳本動态加到DOM樹裡

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這些資料是通過ajax動态增加到dom裡的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

all裡面是通過同步請求傳回的,異步的資料,直接用爬蟲爬取是爬不到的

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

是以要分析異步連結,對它發起請求

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

現在是獲得的資料正好是json了才裝載起來,然後對裡面資料進行分析

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

這裡一開始寫整數不行,加上字元串就行了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

最後可以做個切片

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

XPath是掌握的重點

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

執行個體表需要熟悉

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

XPath的常用解析庫就是lxml,可以解析html和xml,在其中使用XPath函數來進行對元素的定位和提取

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

但是這個lxml又被beautifulsoup包裝了

2020/04/02 04-find系方法參數、css選擇器、Jsonpath

beautifulsoup包裝之後又提供一種很強大的通路方式,可以通過它的通路方式來通路,也可以通過提供的搜尋功能find和find_all進行資料提取,

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

css選擇器是非常重要的内容,把一些常用的選擇器掌握即可

2020/04/02 04-find系方法參數、css選擇器、Jsonpath
2020/04/02 04-find系方法參數、css選擇器、Jsonpath

json解析作為了解,不強求

2020/04/02 04-find系方法參數、css選擇器、Jsonpath