python/java 解析 HTML 網頁數據的幾種方法簡介

工做中常常與數據打交道,去網上抓取數據也成了屢見不鮮。之前就準備抽空總結下的。html

最近恰好看到 http://segmentfault.com/q/1010000000124036 上這篇文章有人問到了,java

並且下面有熱心pythoner 已經回答了,特此整理下,以備忘。python

問題:如今要抓取一批頁面,並將指定標籤裏面的數據抓取出來,如何作到通用性好,穩定可用?git

一、使用第三方庫:mechanizegithub

import mechanize
import cookielib
if __name__=='__main__':
    br = mechanize.Browser()
    br.set_cookiejar(cookielib.LWPCookieJar()) # Cookie jar
    
    br.set_handle_equiv(True) # Browser Option
    br.set_handle_gzip(True)
    br.set_handle_redirect(True)
    br.set_handle_referer(True)
    br.set_handle_robots(False)
    
    br.set_handle_refresh(mechanize._http.HTTPRefreshProcessor(), max_time=1)
    
    br.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')] 
    br.open("http://apple.com")
    print br.title()

輸出爲Apple正則表達式

對於mechanize的詳細使用,參考 http://my.oschina.net/leejun2005/blog/83451 ubuntu

二、使用第三方庫: Beautiful Soup 擴展包來解析segmentfault

import urllib
from bs4 import BeautifulSoup
content = urllib.urlopen('http://www.apple.com/').read()
soup = BeautifulSoup(content)
print soup.find('title').string

輸出爲Apple瀏覽器

對於Beautiful Soup的詳細使用,參考  http://www.crummy.com/software/BeautifulSoup/bs4/doc/cookie

Python爬蟲入門(8):Beautiful Soup的用法  http://python.jobbole.com/81349/

三、使用第三方庫: lxml 擴展包來解析

from lxml import html
doc = html.parse('http://www.apple.com/')
title = doc.find('.//title').text
print title

四、可使用第三方庫: pyquery (常常與 lxml 結合使用)

from pyquery import PyQuery as pq
d = pq(url='http://apple.com')
print 'Title: ', d('title').text()

五、直接使用正則來解析:

import urllib
import re
url='http://apple.com'
html = urllib.urlopen(url).read()
m = re.findall(r"<title>(.*)</title>", html)
print m[0]

輸出爲Apple

有關python正則的使用請見《Python正則表達式操做指南》 

http://wiki.ubuntu.org.cn/Python%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97

注:

以上幾種方法中,推薦優先使用前 4 種,或者有其它優秀的第三方庫你也能夠嘗試。

之因此不推薦最後的正則解析緣由有2:

(1)HTML存在一些標籤不規範的場景,如<p>, <BR>, 等能夠單獨出現,不用配對出現,

你能夠簡單的認爲他的語法很是靈活,不像 xml 那樣限制的很嚴格,之因此瀏覽器能解析是由於

瀏覽器背後作了許多鮮爲人知的解析工做,若是你要用正則來作,你也須要考慮不少狀況,

並且通用性也會大打折扣。這也是建議你選擇第三方庫的主要緣由。

(2)直接用正則這麼解析,在面對複雜的抓取的時候,正則的性能會是嚴重的瓶頸。

REF:

Python網頁解析:BeautifulSoup vs lxml.html

http://my.oschina.net/apoptosis/blog/118647

六、在 java 中你可使用 jsoup 來方便的解析 html 標籤:

使用 jsoup 對 HTML 文檔進行解析和操做

http://www.ibm.com/developerworks/cn/java/j-lo-jsouphtml/

http://jsoup.org/cookbook/extracting-data/example-list-links

https://github.com/code4craft/jsoup-learning    jsoup-learning

 public static void parseHtmlTag(String html) throws IOException {
		// Document doc = Jsoup.parse(html);
		Document doc = Jsoup.connect("http://www.hao123.com").get();
		Elements links = doc.select("a[href]");
		for (Element link : links) {
			System.out.println(link.attr("abs:href") + "\t" + link.text());
		}
	}
http://www.hao123.com#	再也不提醒
http://go.client.baidu.com/?linkid=211	
http://www.hao123.com	設爲主頁
http://www.hao123.com/redian/tongzhi.htm	主頁修復
...
相關文章
相關標籤/搜索