Python 3中提供了url開啟模組urllib.request和HTML的解析模組html.parser模組。但是html.parser模組的功能比較簡單,很難滿足現今解析網頁內容的需求。Beautiful Soup 4是一個功能非常強大的HTML和XML檔案解析Python庫。而且它提供了非常完善的文檔(http://www.crummy.com/software/BeautifulSoup/bs4/doc/)。
Beautiful Soup 4的安裝及相關問題
Beautiful Soup的最新版本是4.1.1可以在此擷取(http://www.crummy.com/software/BeautifulSoup/bs4/download/)。我使用的是Mac OSX,在這個平台上安裝Beautiful Soup,只需解壓安裝包並運行setup.py檔案即可:
$ python3 setup.py install
安裝過程中如果得到SyntaxError “Invalid syntax” on the line ROOT_TAG_NAME = u'[document]',需要將Python 2的代碼轉化成Python 3:
$ 2to3-3.2 -w bs4
URL中的中文編碼問題
在URL中經常會見到包含中文的情況,如下面這個在去哪兒網上搜尋2012-08-09日從北京到麗江的機票的URL:
http://flight.qunar.com/site/oneway_list.htm?searchDepartureAirport=北京&searchArrivalAirport=麗江&searchDepartureTime=2012-08-09
如果直接將這個URL傳給urllib.request.urlopen會導致TypeError。解決方案是構造一個參數名和參數值的元組,並利用urllib.parse.urlencode方法對其編碼。範例程式碼如下:
1 url ='http://flight.qunar.com/site/oneway_list.htm'2 values ={'searchDepartureAirport':'北京','searchArrivalAirport':'麗江','searchDepartureTime':'2012-07-25'}3 encoded_param = urllib.parse.urlencode(values)4 full_url = url +'?'+ encoded_param
網頁內容抓取:下面的範例程式碼展示了如何抓取百度搜尋索引鍵“網球”時的網頁內容。
1 import urllib.parse 2 import urllib.request 3 from bs4 import BeautifulSoup 4 5 url ='http://www.baidu.com/s' 6 values ={'wd':'網球'} 7 encoded_param = urllib.parse.urlencode(values) 8 full_url = url +'?'+ encoded_param 9 response = urllib.request.urlopen(full_url)10 soup =BeautifulSoup(response)11 soup.find_all('a')