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 详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: echart 图谱_zrend echa
- 下一篇: 字节流转化为文件流_JAVA IO分析一