第十五章 Python和Web

第十五章 Python和Web

本章討論Python Web編程的一些方面。
三個重要的主題:屏幕抓取、CGI和mod_python

屏幕抓取

屏幕抓取是通過程序下載網頁并從中提取信息的過程。
下載數據并對其進行分析

從Python Job Board(http://python.org/jobs)提取招聘單位的名稱和網站。
在這里插入圖片描述

from urllib.request import urlopen
import rep = re.compile('<a href="(/jobs/\\d+)/">(.*?)</a>')
text = urlopen('http://python.org/jobs').read().decode()
for url,name in p.findall(text):print('{}({})'.format(name,url))#結果為:
'''
PhD Position in Computer Simulation &amp; Machine Learning(/jobs/6173)
Data Engineering Senior Lead(/jobs/6172)
Python Systems / Infrastructure Engineer(/jobs/6171)
Django Backend Engineer(/jobs/6170)
Senior Full Stack Engineer(/jobs/6169)
Head of Software Engineering - Python (Python Stack/ Django / FinTech / Google Cloud) – Johannesburg(/jobs/6168)
Senior Software Engineer (Remote)(/jobs/6166)
(Senior) Software Engineer (80-100%, f::m::d)(/jobs/6164)
Senior Backend Developer (Python)(/jobs/6163)
Python/GoLang Developer (Web Scraping)(/jobs/6161)
Scientific Software Developer(/jobs/6160)
Sr. Developer for Python, Django(/jobs/6159)
Data Scientist(/jobs/6156)
Data Scientist (Delivery)(/jobs/6155)
Backend Software Engineer(/jobs/6152)
Senior Python Developer (remote)(/jobs/6151)
REMOTE PYTHON/REACT JOBS(/jobs/6150)
Remote Python Developer(/jobs/6149)
Senior Python Developer(/jobs/6148)
Data Engineer(/jobs/6147)
Distinguished Machine Learning Engineer(/jobs/6146)
Senior Python Engineer(/jobs/6145)
Full Stack Software Engineer(/jobs/6144)
Open Source Engineering Manager(/jobs/6143)
Senior Python Engineer(/jobs/6142)
'''

Tidy和XHTML解析

1,Tidy是什么?
Tidy是用于對格式不正確且不嚴謹的HTML進行修復的工具。
Tidy并不能修復HTML文件存在的所有問題,但確實能夠確保文件是格式良好的(即所有元素都嵌套正確)

2,獲取Tidy
找出可供使用的包裝器: pip search tidy
安裝PyTidyLib:pip install pytidylib

3,為何使用XHTML
XHTML和舊式HTML的主要區別在于,XHTML非常嚴格,要求顯式地結束所有的元素。
在HTML中,可通過(使用標簽<p>)開始另一個段落來結束當前段落,但在XHTML中,必須先(使用標簽</p>)顯式地結束當前段落。
XHTML是一種XML方言,可使用各種出色的工具(如XPath)來處理。
要對Tidy生成的格式良好的XHTML進行解析,一種非常簡單的方式是使用標準庫模塊html.parser中的HTMLParser類。

4,使用HTMLParser
使用HTMLParser意味著繼承它,并重寫各種事件處理方法。

HTMLParser中的回調方法

回調方法何時被調用
handle_starttag(tag, attrs)遇到開始標簽時調用。attrs是一個由形如(name, value)的元組組成的序列
handle_startendtag(tag, attrs)遇到空標簽時調用。默認分別處理開始標簽和結束標簽
handle_endtag(tag)遇到結束標簽時調用
handle_data(data)遇到文本數據時調用
handle_charref(ref)遇到形如&#ref;的字符引用時調用
handle_entityref(name)遇到形如&name;的實體引用時調用
handle_comment(data)遇到注釋時;只對注釋內容調用
handle_decl(decl)遇到形如<!..>的聲明時調用
handle_pi(data)用于處理指令
unknown_decl(data)遇到未知聲明時調用

使用模塊HTMLParser的屏幕抓取程序

from urllib.request import urlopen 
from html.parser import HTMLParserdef isjob(url):try:a, b, c, d = url.split('/')except ValueError:return Falsereturn a == d == '' and b == 'jobs' and c.isdigit()class Scraper(HTMLParser):in_link = False #使用了一個布爾狀態變量(屬性)來跟蹤是否位于相關的鏈接中def handle_starttag(self, tag, attrs): #handle_starttag的參數是一個由形如(key, value)的元組組成的列表attrs = dict(attrs) #因此使用dict將它們轉換為字典,以便管理url = attrs.get('href', '')if tag == 'a' and isjob(url):self.url = urlself.in_link = Trueself.chunks = []def handle_data(self, data):if self.in_link:self.chunks.append(data)def handle_endtag(self, tag):if tag == 'a' and self.in_link:print('{} ({})'.format(''.join(self.chunks), self.url)) #為了(在方法handle_endtag中)輸出結果,將所有的文本塊合并在一起。self.in_link = Falsetext = urlopen('http://python.org/jobs').read().decode() 
parser = Scraper() 
parser.feed(text) #為運行這個解析器,調用其方法feed將并text作為參數
parser.close() #然后調用其方法close。'''
PhD Position in Computer Simulation & Machine Learning (/jobs/6173/)
Data Engineering Senior Lead (/jobs/6172/)
Python Systems / Infrastructure Engineer (/jobs/6171/)
Django Backend Engineer (/jobs/6170/)
Senior Full Stack Engineer (/jobs/6169/)
Head of Software Engineering - Python (Python Stack/ Django / FinTech / Google Cloud) – Johannesburg (/jobs/6168/)
Senior Software Engineer (Remote) (/jobs/6166/)
(Senior) Software Engineer (80-100%, f::m::d) (/jobs/6164/)
Senior Backend Developer (Python) (/jobs/6163/)
Python/GoLang Developer (Web Scraping) (/jobs/6161/)
Scientific Software Developer (/jobs/6160/)
Sr. Developer for Python, Django (/jobs/6159/)
Data Scientist (/jobs/6156/)
Data Scientist (Delivery) (/jobs/6155/)
Backend Software Engineer (/jobs/6152/)
Senior Python Developer (remote) (/jobs/6151/)
REMOTE PYTHON/REACT JOBS (/jobs/6150/)
Remote Python Developer (/jobs/6149/)
Senior Python Developer (/jobs/6148/)
Data Engineer (/jobs/6147/)
Distinguished Machine Learning Engineer (/jobs/6146/)
Senior Python Engineer (/jobs/6145/)
Full Stack Software Engineer (/jobs/6144/)
Open Source Engineering Manager (/jobs/6143/)
Senior Python Engineer (/jobs/6142/)
'''

Beautiful Soup

Beautiful Soup是一個小巧而出色的模塊,用于解析你在Web上可能遇到的不嚴謹且格式糟糕的HTML。
下載并安裝Beautiful Soup:pip install beautifulsoup4

使用Beautiful Soup的屏幕抓取程序

from urllib.request import urlopen 
from bs4 import BeautifulSoup
text = urlopen('http://python.org/jobs').read() 
soup = BeautifulSoup(text, 'html.parser')
jobs = set() 
for job in soup.body.section('h2'): #使用soup.body來獲取文檔體,再訪問其中的第一個section。 使用參數'h2'調用返回的對象。jobs.add('{} ({})'.format(job.a.string, job.a['href'])) #屬性string是鏈接的文本內容,而a['href']為屬性href。print('\n'.join(sorted(jobs, key=str.lower)))
'''
(Senior) Software Engineer (80-100%, f::m::d) (/jobs/6164/)
Backend Software Engineer (/jobs/6152/)
Data Engineer (/jobs/6147/)
Data Engineering Senior Lead (/jobs/6172/)
Data Scientist (/jobs/6156/)
Data Scientist (Delivery) (/jobs/6155/)
Distinguished Machine Learning Engineer (/jobs/6146/)
Django Backend Engineer (/jobs/6170/)
Full Stack Software Engineer (/jobs/6144/)
Head of Software Engineering - Python (Python Stack/ Django / FinTech / Google Cloud) – Johannesburg (/jobs/6168/)
Open Source Engineering Manager (/jobs/6143/)
PhD Position in Computer Simulation & Machine Learning (/jobs/6173/)
Python Systems / Infrastructure Engineer (/jobs/6171/)
Python/GoLang Developer (Web Scraping) (/jobs/6161/)
Remote Python Developer (/jobs/6149/)
REMOTE PYTHON/REACT JOBS (/jobs/6150/)
Scientific Software Developer (/jobs/6160/)
Senior Backend Developer (Python) (/jobs/6163/)
Senior Full Stack Engineer (/jobs/6169/)
Senior Python Developer (/jobs/6148/)
Senior Python Developer (remote) (/jobs/6151/)
Senior Python Engineer (/jobs/6142/)
Senior Python Engineer (/jobs/6145/)
Senior Software Engineer (Remote) (/jobs/6166/)
Sr. Developer for Python, Django (/jobs/6159/)
'''

使用CGI創建動態網頁

通用網關接口(CGI)
CGI是一種標準機制,Web服務器可通過它將(通常是通過Web表達提供的)查詢交給專用程序,并以網頁的方式顯示查詢結果。
要讓CGI腳本能夠通過Web進行訪問(和運行),必須將其放在Web服務器能夠訪問的地方、添加!#行并設置合適的文件權限。
對于重要的Web應用,大多數人都不會直接為其編寫CGI腳本,而是選擇使用Web框架,因為它會替你完成很多繁重的工作。

Python Web應用框架

名稱網站
Djangohttps://djangoproject.com
TurboGearshttp://turbogears.org
web2pyhttp://web2py.com
Grokhttps://pypi.python.org/pypi/grok
Zope2https://pypi.python.org/pypi/Zope2
Pyramidhttps://trypyramid.com
Flaskhttp://flask.pocoo.org

Web服務:更高級的抓取

鑒于實現Web服務的方式眾多(且涉及大量的協議),同時每個Web服務系統都可能提供多種服務,因此有時必須以客戶端能夠自動解讀的方式描述服務,這被稱為元服務
有關這種描述的標準是Web服務描述語言(WSDL)。
WSDL是一種XML格式,描述了通過服務可使用哪些方法以及這些方法的參數和返回值等方面。
除支持SOAP等服務協議外,很多乃至大部分Web服務工具包都支持WSDL。

RSS和相關內容

RSS指的是富網站摘要(Rich Site Summary)、RDF網站摘要(RDF Site Summary)或簡易信息聚合(Really Simple Syndication),具體指哪個取決于版本。
在最簡單的情況下,RSS是一種以XML方式列出新聞的格式。

使用XML—RPC進行遠程過程調用

除簡單的RSS下載和解析機制外,還有遠程過程調用。遠程過程調用是對基本網絡交互的抽象:客戶端程序請求服務器程序執行計算并返回結果,但這個過程被偽裝成簡單的過程(函數或方法)調用。

在客戶端代碼中,遠程過程調用看起來就像普通方法調用,但用來調用方法的對象實際上位于另一臺計算機中。

XML-RPC可能是最簡單的遠程過程調用機制,它使用HTTP和XML來實現網絡通信。

SOAP

SOAP也是一種將XML和HTTP用作底層技術的消息交換協議。
與XML-RPC一樣,SOAP也支持遠程過程調用,但SOAP規范比XML-RPC規范復雜得多。
SOAP是異步的,支持有關路由的元請求,而且類型系統非常復雜(而XML-RPC使用簡單而固定的類型集)。

小結

概念解釋
屏幕抓取指的是自動下載網頁并從中提取信息。程序Tidy及其庫版本是很有用的工具,可用來修復格式糟糕的HTML,然后使用HTTML解析器進行解析。另一種抓取方式是使用Beautiful Soup,即便面對混亂的輸入,它也可以處理。
CGI通用網關接口是一種創建動態網頁的方式,這是通過讓Web服務器運行、與客戶端程序通信并顯示結果而實現的。模塊cgi和cgitb可用于編寫CGI腳本。CGI腳本通常是在HTML表單中調用的。
Flask一個簡單的Web框架,讓你能夠將代碼作為Web應用發布,同時不用過多操心Web部分。
Web應用框架要使用Python開發復雜的大型Web應用,Web應用框架必不可少。對簡單的項目來說,Flask是不錯的選擇;但對于較大的項目,你可能應考慮使用Django或TurboGears。
Web服務Web服務之于程序猶如網頁之于用戶。可以認為,Web服務讓你能夠以更抽象的方式進行網絡編程。常用的Web服務標準包括RSS(以及與之類似的RDF和Atom)、XML-RPC和SOAP。

本章介紹的新函數

函數描述
cgitb.enable()在CGI腳本中啟用棧跟蹤

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378268.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378268.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378268.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

array_chunk_PHP array_chunk()函數與示例

array_chunkPHP array_chunk()函數 (PHP array_chunk() Function) array_chunk() function is an array function, it is used to split a given array in number of array (chunks of arrays). array_chunk()函數是一個數組函數&#xff0c;用于將給定數組拆分為多個數組(數組…

raise

raise - Change a windows position in the stacking order button .b -text "Hi there!"pack [frame .f -background blue]pack [label .f.l1 -text "This is above"]pack .b -in .fpack [label .f.l2 -text "This is below"]raise .b轉載于:ht…

c語言輸出最大素數,for語句計算輸出10000以內最大素數怎么搞最簡單??各位大神們...

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓#include #include int* pt NULL; // primes_tableint pt_size 0; // primes_table 數量大小int init_primes_table(void){FILE* pFile;pFile fopen("primes_table.bin", "rb");if (pFile NULL) {fputs(&q…

【數據結構基礎筆記】【圖】

代碼參考《妙趣橫生的算法.C語言實現》 文章目錄前言1、圖的概念2、圖的存儲形式1、鄰接矩陣&#xff1a;2、鄰接表3、代碼定義鄰接表3、圖的創建4、深度優先搜索DFS5、廣度優先搜索BFS6、實例分析前言 本章總結&#xff1a;圖的概念、圖的存儲形式、鄰接表定義、圖的創建、圖…

第十六章 測試基礎

第十六章 測試基礎 在編譯型語言中&#xff0c;需要不斷重復編輯、編譯、運行的循環。 在Python中&#xff0c;不存在編譯階段&#xff0c;只有編輯和運行階段。測試就是運行程序。 先測試再編碼 極限編程先鋒引入了“測試一點點&#xff0c;再編寫一點點代碼”的理念。 換而…

如何蹭網

引言蹭網&#xff0c;在普通人的眼里&#xff0c;是一種很高深的技術活&#xff0c;總覺得肯定很難&#xff0c;肯定很難搞。還沒開始學&#xff0c;就已經敗給了自己的心里&#xff0c;其實&#xff0c;蹭網太過于簡單。我可以毫不夸張的說&#xff0c;只要你會windows的基本操…

android對象緩存,Android簡單實現 緩存數據

前言1、每一種要緩存的數據都是有對應的versionCode&#xff0c;通過versionCode請求網絡獲取是否需要更新2、提前將要緩存的數據放入assets文件夾中&#xff0c;打包上線。緩存設計代碼實現/*** Created by huangbo on 2017/6/19.** 主要是緩存的工具類** 緩存設計&#xff1a…

通信原理.緒論

今天剛上通信原理的第一節課&#xff0c;沒有涉及過多的講解&#xff0c;只是講了下大概的知識框架。現記錄如下&#xff1a; 目錄1、基本概念消息、信息與信號2、通信系統模型1、信息源2、發送設備3、信道4、接收設備5、信宿6、模擬通信系統模型7、數字通信系統模型8、信源編…

Android版本演進中的兼容性問題

原文&#xff1a;http://android.eoe.cn/topic/summary Android 3.0 的主要變化包括: 不再使用硬件按鍵進行導航 (返回、菜單、搜索和主屏幕)&#xff0c;而是采用虛擬按鍵 (返回&#xff0c;主屏幕和最近的應用)。在操作欄固定菜單。 Android 4.0 則把這些變化帶到了手機平臺。…

css rgba透明_rgba()函數以及CSS中的示例

css rgba透明Introduction: 介紹&#xff1a; Functions are used regularly while we are developing a web page or website. Therefore, to be a good developer you need to master as many functions as you can. This way your coding knowledge will increase as well …

第十七章 擴展Python

第十七章 Python什么都能做&#xff0c;真的是這樣。這門語言功能強大&#xff0c;但有時候速度有點慢。 魚和熊掌兼得 本章討論確實需要進一步提升速度的情形。在這種情況下&#xff0c;最佳的解決方案可能不是完全轉向C語言&#xff08;或其他中低級語言&#xff09;&…

android studio資源二進制,無法自動檢測ADB二進制文件 – Android Studio

我嘗試在Android Studio上測試我的應用程序,但我遇到了困難"waiting for AVD to come online..."我讀過Android設備監視器重置adb會做到這一點,它確實……對于1次測試,當我第二天重新啟動電腦時,我不僅僅是&#xff1a;"waiting for AVD to come online..."…

犀牛腳本:仿迅雷的增強批量下載

迅雷的批量下載滿好用。但是有兩點我不太中意。在這個腳本里會有所增強 1、不能設置保存的文件名。2、不能單獨設置這批下載的線程限制。 使用方法 // 下載從編號001到編號020的圖片&#xff0c;保存名為貓咪寫真*.jpg 使用6個線程 jdlp http://bizhi.zhuoku.com/bizhi/200804/…

為什么使用1 * 1 的卷積核

為什么使用 1* 1卷積核&#xff1f; 作用&#xff1a; 1、實現跨通道的交互和信息整合 2、 進行卷積核通道數的降維和升維 3、 在保持feature map尺度不變的&#xff08;即不損失分辨率&#xff09;的前提下大幅增加非線性特性 跨通道的交互和信息整合 使用1 * 1卷積核&a…

KingPaper初探ThinkPHP3.1.2之擴展函數庫和類庫的使用(四)

在我們做項目的時候TP的系統函數或系統類庫滿足不了我們的需要 所以有些東西需要我們自己去定義&#xff0c;在TP中我們怎么使用自己的函數庫和類庫呢&#xff1f;在TP系統中提供了三個系統函數庫 common.php是全局必須加載的基礎函數庫&#xff0c;在任何時候都可以直接調用&a…

isfinite函數_isfinite()函數以及C ++中的示例

isfinite函數C isfinite()函數 (C isfinite() function) isfinite() function is a library function of cmath header, it is used to check whether the given value is a finite value or not? It accepts a value (float, double or long double) and returns 1 if the v…

android 服務端 漏洞,安卓漏洞 CVE 2017-13287 復現詳解-

2018年4月&#xff0c;Android安全公告公布了CVE-2017-13287漏洞。與同期披露的其他漏洞一起&#xff0c;同屬于框架中Parcelable對象的寫入(序列化)與讀出(反序列化)的不一致所造成的漏洞。在剛看到谷歌對于漏洞給出的補丁時一頭霧水&#xff0c;在這里要感謝heeeeenMS509Team…

某公司面試題

一、基礎題 1&#xff0c;馮諾依曼結構的計算機硬件邏輯組成中&#xff0c;不包含以下哪個模塊&#xff1f; A&#xff0c;編譯器 B&#xff0c;控制器 C&#xff0c;輸入設備 D&#xff0c;輸出設備 解釋&#xff1a;馮諾依曼由五個模塊組成&#xff1a;輸入設備 輸出設備 存…

GAP(全局平均池化層)操作

轉載的文章鏈接&#xff1a; 為什么使用全局平均池化層&#xff1f; 關于 global average pooling https://blog.csdn.net/qq_23304241/article/details/80292859 在卷積神經網絡的初期&#xff0c;卷積層通過池化層&#xff08;一般是 最大池化&#xff09;后總是要一個或n個全…

zoj1245 Triangles(DP)

/* 動態三角形&#xff1a;每次DP時考慮的是兩個子三角形的高度即可 注意&#xff1a; 三角形可以是倒置的。 */ View Code 1 #include <iostream> 2 #include <cstdlib> 3 #include <cstring> 4 #include <stdio.h> 5 6 using namespace std; 7 8…