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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > HTML >内容正文

HTML

Python urllib与requests、XML和HTMLParser

發布時間:2025/3/20 HTML 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python urllib与requests、XML和HTMLParser 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python 的內建模塊urllib提供了一系列用于操作url的方法

Get
urllib的request可以非常方便的抓取URL的內容,通過GET發送一個請求到指定頁面,然后返回HTTP響應

還可以模仿瀏覽器發送一個GET請求,需要request對象,通過向request對象中添加HTTP請求頭,就可以把請求偽裝為一個瀏覽器

Post
需要把參數以bytes類型傳入

Handler
如果還需要更復雜的控制,加入需要通過一個代理去登陸網站,需要使用proxyhandler模塊

urllib提供的功能就是通過程序完成各種各樣的HTTP請求,如果需要模仿瀏覽器完成特定功能,需要將請求偽裝為瀏覽器請求,偽裝的方法是先監控瀏覽器發出的請求,然后再根據瀏覽器的請求頭來偽裝,User-Agent頭就是用來識別瀏覽器的

requests
requests是用于操作URl的第三方模塊,相比Python提供的內建模塊urllib,此模塊使用起來更方便

使用GET訪問一個頁面

  • 使用params參數傳入一個dict類型的參數做為訪問url的參數

  • 使用headers參數,傳入一個dict類型的參數作為請求頭

requests默認使用application/x-www-form-urlencoded對POST數據編碼。如果要傳遞JSON數據,可以直接傳給json參數

params = {'key': 'value'} r = requests.post(url, json=params) # 內部自動序列化為JSON

如果需要上傳文件,可以直接將一個file對象傳給files參數

>>> upload_files = {'file': open('report.xls', 'rb')} >>> r = requests.post(url, files=upload_files)

在讀取文件時,注意務必使用’rb’即二進制模式讀取,這樣獲取的bytes長度才是文件的長度。

把post()方法替換為put(),delete()等,就可以以PUT或DELETE方式請求資源。

除了能輕松獲取響應內容外,requests對獲取HTTP響應的其他信息也非常簡單。

例如,獲取響應頭

>>> r.headers {Content-Type': 'text/html; charset=utf-8', 'Transfer-Encoding': 'chunked', 'Content-Encoding': 'gzip', ...} >>> r.headers['Content-Type'] 'text/html; charset=utf-8'

requests對Cookie做了特殊處理,使得我們不必解析Cookie就可以輕松獲取指定的Cookie

>>> r.cookies['ts'] 'example_cookie_12345'

要在請求中傳入Cookie,只需準備一個dict傳入cookies參數

可以使用encoding屬性查看編碼

無論響應的內容是文本或者二進制文件,都可以使用content屬性獲取其bytes對象

如果響應的是特定的類型,比如Json,可以使用json()方法直接獲取

最后,要指定超時,傳入以秒為單位的timeout參數:

>>> r = requests.get(url, timeout=2.5) # 2.5秒后超時

XML

操作XML有兩種方法:DOM和SAX。DOM會把整個XML讀入內存,解析為樹,因此占用內存大,解析慢,優點是可以任意遍歷樹的節點。SAX是流模式,邊讀邊解析,占用內存小,解析快,缺點是我們需要自己處理事件。

正常情況下,優先考慮SAX,因為DOM實在太占內存。

注意使用attrs這個值

當SAX解析器讀到一個節點時:

<a href="/">python</a>

會產生3個事件:

  • start_element事件,在讀取時;

  • char_data事件,在讀取python時;

  • end_element事件,在讀取時。

  • 什么是事件呢?

    ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' from xml.parsers.expat import ParserCreate class DefaultSaxHandler(object):def start_element(self,name,attrs):print('sax:start_element:%s,attrs:%s'%(name,str(attrs)))#這里可以寫 當讀到這里時要發生的事件def end_element(self,name):print('sax:end_element:%s'%name)#這里可以寫 當讀到這里時要發生的事件def char_data(self,text):print('sax:char_data:%s'%text)#這里可以寫 當讀到這里時要發生的事件 xml = r'''<?xml version="1.0"?> <ol><li><a href="/python">Python</a></li><li><a href="/ruby">Ruby</a></li> </ol> ''' handler=DefaultSaxHandler() parser=ParserCreate() parser.StartElementHandler=handler.start_element parser.EndElementHandler=handler.end_element parser.CharacterDataHandler=handler.char_data parser.Parse(xml) #輸出 sax:start_element:ol,attrs:{} sax:char_data:sax:char_data: sax:start_element:li,attrs:{} sax:start_element:a,attrs:{'href': '/python'} sax:char_data:Python sax:end_element:a sax:end_element:li sax:char_data:sax:char_data: sax:start_element:li,attrs:{} sax:start_element:a,attrs:{'href': '/ruby'} sax:char_data:Ruby sax:end_element:a sax:end_element:li sax:char_data:sax:end_element:ol

    需要注意的是讀取一大段字符串時,CharacterDataHandler可能被多次調用,所以需要自己保存起來,在EndElementHandler里面再合并。

    除了解析XML外,如何生成XML呢?99%的情況下需要生成的XML結構都是非常簡單的,因此,最簡單也是最有效的生成XML的方法是拼接字符串:

    如果要生成復雜的XML呢?建議你不要用XML,改成JSON。

    解析XML時,注意找出自己感興趣的節點,響應事件時,把節點數據保存起來。解析完畢后,就可以處理數據。

    比如可以解析XML數據獲得相關城市的天氣信息(略)

    HTMLParser

    當我們爬取了網頁,下一步就是解析HTML頁面,看看里面的內容,到底是圖片、視頻還是文本。

    利用HTMLParser,可以把網頁中的文本、圖像等解析出來。

    HTML本質上是XML的子集,但是語法沒有XML要求的那么嚴格,所以不能通過標準的DOM或者SAX來解析HTML

    好在Python提供了HTMLParser來非常方便地解析HTML,只需簡單幾行代碼:

    注意使用attrs這個值,可以用來抽取鏈接、識別id為某個值元素

    from html.parser import HTMLParser from html.entities import name2codepointclass MyHTMLParser(HTMLParser):def handle_starttag(self, tag, attrs):print('<%s>' % tag)def handle_endtag(self, tag):print('</%s>' % tag)def handle_startendtag(self, tag, attrs):print('<%s/>' % tag)#如img標簽<img src="",alt=""/>def handle_data(self, data):print(data)def handle_comment(self, data):print('<!--', data, '-->')def handle_entityref(self, name):#解析特殊字符print('&%s;' % name)def handle_charref(self, name):#解析特殊字符print('&#%s;' % name)parser = MyHTMLParser() parser.feed('''<html> <head></head> <body> <!-- test html parser --><p>Some <a href=\"#\">html</a> HTML tutorial...<br>END</p> </body></html>''') #輸出 (sort) λ python fortest.py <html><head> </head><body><!-- test html parser --><p> Some <a> html </a>HTML tutorial... <br> END </p></body> </html>

    feed()方法可以多次調用,也就是不一定一次把整個HTML字符串都塞進去,可以一部分一部分塞進去。

    可是這樣怎么識別有特定id的標簽呢?,注意使用attrs這個值

    ''' 遇到問題沒人解答?小編創建了一個Python學習交流QQ群:857662006 尋找有志同道合的小伙伴,互幫互助,群里還有不錯的視頻學習教程和PDF電子書! ''' def find_id(self,id_name,attrs):for i in attrs:if id_name in i:return Truereturn Falsedef handle_starttag(self, tag, attrs):if self.find_id('test1',attrs):print('<%s%s>' %(tag,str(attrs)))passparser.feed('''<html> <head></head> <body> <!-- test html parser --><p class='test' id='test1'>Some <a href=\"#\">html</a> HTML tutorial...<br>END</p> </body></html>''')#輸出 pass <p[('class', 'test'), ('id', 'test1')]> pass

    特殊字符有兩種,一種是英文表示的?,一種是數字表示的?,這兩種字符都可以通過Parser解析出來。

    總結

    以上是生活随笔為你收集整理的Python urllib与requests、XML和HTMLParser的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 亚欧美日韩| 91视频国产一区 | 大尺度电影在线 | 免费看91| www.-级毛片线天内射视视 | 日韩福利电影在线 | 美女露出让男生揉的视频 | 超碰成人久久 | 91日韩欧美| 米奇色| 无码人妻aⅴ一区二区三区69岛 | 欧美日本在线播放 | 男女网站视频 | 神马午夜嘿嘿 | 亚洲成人免费看 | 98色| 女性爱爱视频 | 无码人妻精品一区二区三区99日韩 | 日本做爰全过程免费看 | 6080亚洲精品一区二区 | 日日夜夜爱 | 精品久久香蕉国产线看观看亚洲 | 日韩视频播放 | 在线亚洲欧美 | 国产成人精品视频ⅴa片软件竹菊 | 亚洲天堂av线 | 国产精品色图 | 特黄一级片 | 男女做激情爱呻吟口述全过程 | 国产一区二区三区高清视频 | 性欧美丰满熟妇xxxx性仙踪林 | 国产美女一区二区 | 黄色av网站免费观看 | 日本韩国中文字幕 | 四虎精品一区 | 免费看毛片的网站 | 国产特黄级aaaaa片免 | 91精品国产综合久久福利软件 | 亚色视频在线 | 中日韩精品在线 | 欧美激情视频在线播放 | 亚洲午夜久久久久久久久红桃 | 免费成人电影在线观看 | 91桃色在线观看 | av一区在线播放 | 中文字幕 欧美 日韩 | 6080亚洲精品一区二区 | 欧美r级在线观看 | 日韩永久| 国产肥白大熟妇bbbb视频 | 神马午夜dy888 | 日韩一区二区三 | 在线观看免费的av | 懂色av蜜臀av粉嫩av喷吹 | 深夜激情网 | 国内免费av | www.av在线 | 鲁丝一区二区 | 国产精品av久久久久久无 | 黄视频免费看在线 | 天天操天天看 | 免费成人蒂法网站 | 专业操老外 | 久久午夜电影 | 日本伦理片在线播放 | 成人免费高清在线播放 | 久久亚洲熟女cc98cm | 波多野结衣激情视频 | 91亚洲国产成人精品一区二三 | 亚洲天天综合网 | 欧美精品久久久久久 | 久久福利视频导航 | 少妇高潮一区二区三区99小说 | 亚洲最大福利 | 欧美日韩成人在线视频 | 日本免费毛片 | 精品久久久久久久久中文字幕 | 日日夜夜一区 | 怡红院成人影院 | 欧美少妇xxx| 青青青视频在线播放 | 手机成人av| 欧美亚洲国产日韩 | 久久久久久九九九 | 久久视频免费观看 | 黄色小视频链接 | 国产精品videossex久久发布 | 香蕉视频在线视频 | 91九色porny视频 | 欧美精品日韩 | 天堂av亚洲 | 激情久久免费视频 | 日韩精品在线免费视频 | 一级黄色大全 | 国精品一区二区三区 | 成年人在线免费观看网站 | 中文欧美日韩 | 奇米网久久 | 波多野结衣中文字幕一区二区三区 |