日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

pyquery获取不到网页完整源代码_PyQuery 详解

發布時間:2025/3/19 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 pyquery获取不到网页完整源代码_PyQuery 详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在之前寫的爬蟲入門里,PyQuery一筆帶過,這次詳細地講一下。

為什么選擇PyQuery?

Python爬蟲解析庫,主流的有

  • PyQuery

  • Beautifulsoup

  • Scrapy Selectors

  • 正則表達式。

PyQuery和scrapy Selectors都是基于lxml模塊,而lxml和正則表達式都是C語言寫的,只有Beautifulsoup是用純Python編寫的,所以在實測中,Beautifulsoup 的解析速度比其他幾種慢了5倍以上!

正則表達式的構造稍微復雜一點,一般在結構化的網頁中沒必要用正則(易出錯)。Scrapy Selectors支持css,xpath以及正則表達式,PyQuery只支持css(我最開始學的是xpath,后來覺得css語法更精簡一些)。Scrapy Selector中的css語法和PyQuery中的略有不同,本文以PyQuery為例(不用Scrapy框架的話,PyQuery就夠用了)

如何使用?

首先在命令行里 pip install pyquery 安裝一下

我們以果殼首頁為例,首先引入,并將源代碼實例化

import requestsfrom pyquery import PyQuery as pqurl = 'https://www.guokr.com/'r = requests.get(url)#實例化doc = pq(r.text)
獲取文本

例如你想要各個板塊的名字

通過f12查看源代碼,你發現板塊名都在class值為content-title的h2標簽下

在PyQuery中,class的值寫在小數點 . 后面,標簽直接寫(ID是寫在#后面)

print(doc('h2.content-title'))

于是所有滿足條件的源代碼都出來了,獲取標簽的文本內容用text()

print(doc('h2.content-title').text())

想遍歷的話,

lis = doc('h2.content-title').items()for li in lis: ? ?print(li.text())

假設我們想要獲取所有標題

看源代碼會發現 ,小標題的內容都在div.content下面的ul標簽 下面的 第二個li標簽 開始(通過縮進來看嵌套關系),而第一個li標簽里面是大標題的內容

#用空格表示子孫節點lis = doc('div.content ul li').items()#lis = doc('div.content li').items()for i in lis: ? ?print(i.text())

空格表示子孫節點,只要在div.content標簽下面的節點,都能獲取到

所以上面的代碼可以省略ul標簽,直接到li標簽

有時候標簽會有多個類名的情況,例如(我隨便構造一個):

假設類名為cont的標簽不唯一,也就是通過cont不能準確地定位這一個標簽,還需要加上其他類名

print(doc('div.cont.a.b.c.d'))

標簽里的空格表示并列,表示這個div標簽有cont,a,b,c,d這五個類名,但在css語法里空格表示嵌套,所以我們要添加其他類名的時候不能輸入空格,而是直接用小數點來添加其他類名

獲取屬性

前面說了獲取文本用text(),現在介紹獲取屬性的方法,即attr("屬性名"),比方說我們要獲取所有標題的鏈接,一般來說鏈接都在href屬性里

lis = doc('div.content li').items()for i in lis: ? ?print(i.text(),i('a').attr('href'))

剩下的一些選擇器方法就不贅述了,列出來大家試一下應該就能明白了

lis = doc('div.content ul li')#父節點,包含父節點的所有子孫節點的內容#相當于#print(doc('div.content ul'))print(lis.parent())#祖先節點,就相當于所有源代碼了print(lis.parents())#兄弟節點,即同級節點,不包含自己print(lis.siblings)
其他技巧

1.偽類選擇器

如果想要每個版塊的第一條小標題的話

#第二個標簽lis = doc('div.content li:nth-child(2)').items()for i in lis: ? ?print(i.text(),i('a').attr('href'))

第一個a標簽的語法是 a:first-child,最后一個是a:last-child,其它位置的語法如上圖所示,第幾個括號里就是幾(當然第一個你也可以寫成 li:nth-child(1))

類似地,如果你想要只要小標題,也就是從第二個li開始到最后一個li

#div.content 下面第二個(含)之后的li標簽lis = doc('div.content li:gt(1)').items()for i in lis: ? ?print(i.text(),i('a').attr('href'))

gt就是greater than,大于的意思,lt (less than)是小于

還可以用偽類選擇器來篩選文本

lis = doc('div.content ul').items()for i in lis: ? ?#文本包含問號的li標簽 ? ?print(i("li:contains('?')").text())

2.修改標簽屬性

如果我只想要小標題,這里再介紹一種方法

從源代碼來看,想要所有小標題就是要排除ul標簽下面的第一個li標簽,通過觀察發現它的特點就是類名(class值)為content-article,而其它li標簽沒有,所以我們可以利用這點

#用remove把特定標簽移除,然后再進行遍歷lis = doc('div.content ul').remove('.content-article').items()for i in lis: ? ?print(i.text())

PyQuery里還有一些方法,比如修改屬性,增加css之類的一些使用率較低的就不介紹了,詳情可參考pyquery官方文檔的 PyQuery complete API

直接在Chrome里調試

其實我們的Chrome瀏覽器自帶css的查詢方法,按f12或者右鍵檢查,打開Elements面板,按ctrl+f,

這里支持xpath,css語法,以及普通的字符查找

要注意的是右邊的數字,顯示的是滿足條件的標簽數量,可以按向下的箭頭過一遍,看看是不是自己想要的信息。

稍微認真寫一下就發現知識點還是挺多的,看來這篇詳解還是有點意義的。

感謝觀看!

總結

以上是生活随笔為你收集整理的pyquery获取不到网页完整源代码_PyQuery 详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。