一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 如何替換URL中的Query字段?

如何替換URL中的Query字段?

2021-08-31 22:00未聞Codekingname 編程技術

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

 如何替換URL中的Query字段?

在我們寫爬蟲的時候,可能會需要在爬蟲里面基于當前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) 

運行效果如下圖所示:

如何替換URL中的Query字段?

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

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

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

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

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

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

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

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

  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) 

運行效果如下圖所示:

如何替換URL中的Query字段?

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

其中urlparse 和urlunparse 是一對相反函數,前者把網址轉成 ParseResult 對象,后者把ParseResult對象轉回網址字符串。

如何替換URL中的Query字段?

ParseResult 對象的.query 屬性,是一個字符串,也就是網址中,問號后面的內容,格式如下:

如何替換URL中的Query字段?

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

如何替換URL中的Query字段?

當使用parse_qs把 query轉成字典以后,就可以修改參數的值,然后再重新轉回去。

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

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

原文鏈接:https://mp.weixin.qq.com/s/ZwA9ZDBAuJopJXvCZIlxCw

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色哟哟哟在线精品观看视频 | 欧美一级精品 | 欧美男同video | 日韩专区在线观看 | 波多野结衣之高校教师 | 我们日本在线观看免费动漫下载 | 国产精品成人va在线观看 | 久久热国产在线视频 | 国产欧美一区二区三区免费 | 男人桶女下面60分钟视频 | 日本高清在线播放 | 毛片在线观看网站 | 日本爽p大片免费观看 | 女同videos双性人 | 久久国产精品免费网站 | 无遮挡激情 | 久久精品国产欧美日韩99热 | 高清一区 | 国产高清在线播放刘婷91 | 国内精品九一在线播放 | 四虎国产一区 | 91日本在线观看亚洲精品 | 九九九九在线视频播放 | 手机看片一区二区 | 91传媒制片厂果冻有限公司 | 欧美色影视 | 99热精品69堂国产 | 成人伊在线影院 | 12345国产精品高清在线 | 成人免费视频播放 | 茄子视频懂你更多apl | 青青青久热国产精品视频 | 五月天久久久 | 亚洲精品αv一区二区三区 亚洲精品91大神在线观看 | 欧美视频在线一区二区三区 | 欧美人成绝费网站色www吃脚 | 亚洲国产精品自在自线观看 | 第一国内永久免费福利视频 | 男女激情视频1000辣妞范 | 午夜小视频免费观看 | 网址在线观看你懂我意思吧免费的 |