Tidy 和 HTML 解析
Beautiful Soup
屏幕抓取:是通過程序下載網頁並從中提取信息的過程。
簡單來見:下載數據並對其進行分析
思路:可使用urllib來獲取網頁的HTML代碼,再使用正則表達式從中提取信息。
例如:假設要從python Job Board(http://python.org/jobs)提取招聘單位的名稱和網站。
通過查看該網站的源代碼,可發現類似於下面的鏈接中找到名稱和URL:
<a href="/jobs/1970/">Python Engineer</a>
如下:簡單的屏幕抓取程序
from urllib.request import urlopen import re p = 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))
以上代碼需要跟進的地方:
1.正則表達式一點都不容易理解。如果HTML代碼和查詢更復雜,那正則表達式就難以理解和維護
2.無法處理獨特的HTML內容;比如CDATA部分和實符字體(如&)
正則表達式依賴於HTML代碼的細節,並不是抽象的結構;意味着只要網頁的結構發生一點點變化,那這個程序可能就無效了。
針對基於正則表達式的方法存在的問題,可有兩種解決方案:
(1)結合使用程序Tidy(一個python庫)和XHTML解析
(2) 使用專為屏幕抓取而設計的Beautiful Soup
Tidy 和XHTML解析
Tidy是用於對格式不正確且不嚴謹的HTML進行修復的工具,它非常聰明,能夠修復很多常見的錯誤,從而完成大量你不願意做的工作。它還提供了極大的配置空間,讓你能夠開 / 關各種校正。
當然,Tidy並不能修復HTML文件存在的所有問題,但確實能夠確保文件是格式良好的(即所有元素都嵌套正確),這讓解析工作容易很多。
獲取Tidy
有多個用於python的Tidy庫包裝器,至於哪個最新並非固定不變的,找使用pip來找出可供使用的包裝器:
$pip search tidy
可選擇安裝PyTidyLib:
$ pip install pytidylib
並非一定要安裝Tidy庫包裝器。如果你是用的是unix或者linux系統,很可能已經默認安裝了命令行版Tidy。此外,不管使用的是什么系統,都可以從Tidy網站上獲取可執行的二進制版本,有了二進制版本之后,就可以使用模塊subprocess(或其他包含open函數的模塊)來運行Tidy程序了。
如果python找不到tidy,可能需要提供這個可執行文件的完整路徑。
XHTML 和 HTML的主要區別在於,XHTML非常嚴格,要求顯式地結束所有的元素;
因此,在HTML可通過(使用標簽<p>)開始另一個段落來結束當前段落,但在XHTML中,必須先(使用標簽</p>)顯式地結束當前段落。這讓XHTML解析起來容易得多,因為你能清除地直到何時進入或者離開各種元素,
XHTML的另一個優點:它是一種XML方言,可食用各種出色的工具(XPath)來處理
要求對Tidy生成的格式良好的XHTML進行解析,一種非常簡單的方式就是使用標准庫模塊html.parser中的HTMLParser類
待補充~
