偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

如何替換URL中的Query字段?

網(wǎng)絡(luò) 通信技術(shù)
由于ParseResult對象的.query屬性是只讀屬性,不能覆蓋,因此我們需要調(diào)用一個內(nèi)部方法._replace把新的.query字段替換上去,生成新的 ParseResult對象。最后再把它轉(zhuǎn)回網(wǎng)址。

 [[420519]]

在我們寫爬蟲的時候,可能會需要在爬蟲里面基于當(dāng)前url生成一個新的url。例如下面這段偽代碼:

  1. import re 
  2. current_url = 'https://www.kingname.info/archives/page/2/' 
  3. current_page = re.search('/(\d+)', current_url).group(1) 
  4. next_page = int(current_page) + 1 
  5. next_url = re.sub('\d+', str(next_page), current_url) 
  6. make_request(next_url) 

運行效果如下圖所示:

但有時候,翻頁參數(shù)不一定是數(shù)字。例如有些網(wǎng)站,訪問一個URL:https://xxx.com/articlelist?category=technology&after=asdrtJKSAZFD

當(dāng)你訪問這個url的時候,它返回的是一個JSON字符串,并且這個JSON里面,有如下字段:

  1. ... 
  2. "paging": { 
  3.         "cursors": { 
  4.             "before""MTA3NDU0NDExNDEzNTgz"
  5.             "after""MTE4OTc5MjU0NDQ4NTkwMgZDZD" 
  6.         }, 
  7.          
  8.     } 
  9. ... 

這種情況多見于信息流網(wǎng)站。它只能無限下滑看下一頁,不能直接通過頁數(shù)跳頁。每次請求的時候返回下一頁的參數(shù)after。當(dāng)要訪問下一頁的時候,用這個參數(shù)替換當(dāng)前url中的after=后面的參數(shù)。

這樣一來,替換url中的參數(shù)就并不是一件簡單的事情了。因為網(wǎng)址可能有4種情況:

  • 第一頁,沒有after參數(shù):https://xxx.com/articlelist?category=technology
  • 第一頁,有after參數(shù)名但沒有值:https://xxx.com/articlelist?category=technology&after=
  • 后續(xù)頁面,after參數(shù)值后面沒有內(nèi)容: https://xxx.com/articlelist?category=technology&after=asdrtJKSAZFD
  • 后續(xù)頁面,aster參數(shù)值后面有內(nèi)容:https://xxx.com/articlelist?category=technology&after=asdrtJKSAZFD&other=abc

大家可以試一試,如果用正則表達(dá)式,怎么覆蓋這4種情況,生成下一頁的網(wǎng)址。

實際上,我們不需要使用正則表達(dá)式。Python自帶的urllib模塊已經(jīng)提供了解決這個問題的方案了。我們先來看一段代碼:

  1. from urllib.parse import urlparse, urlunparse, parse_qs, urlencode 
  2.  
  3.  
  4. def replace_field(url, name, value): 
  5.     parse = urlparse(url) 
  6.     query = parse.query 
  7.     query_pair = parse_qs(query) 
  8.     query_pair[name] = value 
  9.     new_query = urlencode(query_pair, doseq=True
  10.     new_parse = parse._replace(query=new_query) 
  11.     next_page = urlunparse(new_parse) 
  12.     return next_page 
  13.  
  14. url_list = [ 
  15.     'https://xxx.com/articlelist?category=technology'
  16.     'https://xxx.com/articlelist?category=technology&after='
  17.     'https://xxx.com/articlelist?category=technology&after=asdrtJKSAZFD'
  18.     'https://xxx.com/articlelist?category=technology&after=asdrtJKSAZFD&other=abc' 
  19.  
  20. for url in url_list: 
  21.     next_page = replace_field(url, 'after''0000000'
  22.     print(next_page) 

運行效果如下圖所示:

從圖中可以看到,這4種情況,都可以被我們成功添加下一頁的參數(shù)after= 0000000。不用再去考慮正則表達(dá)式怎么適配所有情況。

其中urlparse 和urlunparse 是一對相反函數(shù),前者把網(wǎng)址轉(zhuǎn)成 ParseResult 對象,后者把ParseResult對象轉(zhuǎn)回網(wǎng)址字符串。

ParseResult 對象的.query 屬性,是一個字符串,也就是網(wǎng)址中,問號后面的內(nèi)容,格式如下:

parse_qs與urlencode也是一對相反函數(shù)。其中前者把 .query輸出的字符串轉(zhuǎn)成字典,而后者把字段轉(zhuǎn)成.query形式的字符串:

當(dāng)使用parse_qs把 query轉(zhuǎn)成字典以后,就可以修改參數(shù)的值,然后再重新轉(zhuǎn)回去。

由于ParseResult對象的.query屬性是只讀屬性,不能覆蓋,因此我們需要調(diào)用一個內(nèi)部方法._replace把新的.query字段替換上去,生成新的 ParseResult對象。最后再把它轉(zhuǎn)回網(wǎng)址。

以上,就是今天我們介紹的,如何使用urllib自帶的函數(shù)替換網(wǎng)址中的字段。

 

責(zé)任編輯:武曉燕 來源: 未聞Code
相關(guān)推薦

2010-09-28 15:54:55

SQL替換字段

2010-09-28 16:02:46

替換SQL字段

2010-11-22 12:04:09

MySQL字段

2010-09-28 16:22:23

SQL ntext字段

2014-06-27 09:34:03

AngularJS

2020-10-28 08:10:27

URL域名https

2021-11-27 23:54:44

監(jiān)控Snuba數(shù)據(jù)

2010-04-23 18:11:28

Aix鏡像

2011-07-21 10:44:57

Sharepoint列.net托管代碼

2009-07-31 09:58:20

URL映射ASP.NET

2023-02-01 14:08:53

JavaScriptURL安全

2010-10-25 10:13:16

ibmdwWebSphere

2010-11-26 10:29:21

MySQL批量替換

2024-01-02 08:43:48

qs工具庫格式化

2010-11-22 12:14:55

MySQL字段

2010-11-22 12:59:30

MySQL字段

2009-06-29 09:00:42

Hibernate的Q

2019-02-26 13:00:11

JavaScriptURL前端

2021-08-11 22:50:53

JavaScript編程開發(fā)

2009-10-12 10:33:11

Javascript替
點贊
收藏

51CTO技術(shù)棧公眾號