文档章节

python/java 解析 HTML 网页数据的几种方法简介

大数据之路
 大数据之路
发布于 2012/10/17 02:28
字数 769
阅读 1541
收藏 9

工作中经常与数据打交道,去网上抓取数据也成了家常便饭。以前就准备抽空总结下的。

最近刚好看到 http://segmentfault.com/q/1010000000124036 上这篇文章有人问到了,

而且下面有热心pythoner 已经回答了,特此整理下,以备忘。

问题:现在要抓取一批页面,并将指定标签里面的数据抓取出来,如何做到通用性好,稳定可用?

1、使用第三方库:mechanize

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

2、使用第三方库: Beautiful Soup 扩展包来解析

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/

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

3、使用第三方库: lxml 扩展包来解析

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

4、可以使用第三方库: pyquery (经常与 lxml 结合使用)

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

5、直接使用正则来解析:

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

6、在 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	主页修复
...


本文转载自:http://segmentfault.com/q/1010000000124036

共有 人打赏支持
大数据之路
粉丝 1507
博文 516
码字总数 342856
作品 0
武汉
架构师
为什么Python成了开发AI的主流语言?Java系列、Ruby等编程语言不行吗?

导读 说道开发AI的语言,很多人说,不是Python吗?没错,Python是可以开发AI,但是不知道你们有没有想过,真的就只有Python才可以开发AI吗? 其实,像Java、Ruby也是开发AI很好的选择,但是为...

柯西带你学编程
05/29
0
0
Python 用于网站抓取 登录 发布的模块介绍

由于目前的Web开发中AJAX、Javascript、CSS的大量使用,一些网站上的重要数据是由Ajax或Javascript动态生成的,并不能直接通过解析html页面内容就能获得(例如采用mechanize、lxml、Beautif...

shaohan
2014/03/20
0
0
【Python入门只需20分钟】从安装到数据抓取、存储原来这么简单

  基于大众对Python的大肆吹捧和赞赏,作为一名Java从业人员,我本着批判与好奇的心态买了本python方面的书《毫无障碍学Python》。仅仅看了书前面一小部分的我......决定做一名python的脑残...

旺旺笔记
08/23
0
0
Python是如何战胜其他编程语言,强势夺魁!

世界上的编程语言有600多种,但真正主流使用的也仅有二三十种。且随着计算机的发展,新的语言在不断的诞生,过时的语言也在不断的被淘汰。因此,IT开发人员应与时俱进学习主流编程语言! Py...

python编程
08/04
0
0
python和java哈希值区分

欢迎关注天善智能,我们是专注于商业智能BI,人工智能AI,大数据分析与挖掘领域的垂直社区,学习,问答、求职一站式搞定! 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴...

天善智能
06/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

MySQL autocommit探究

-- sessionA:tx_isolation=REPEATABLE-READmysql> select connection_id();+-----------------+| connection_id() |+-----------------+| 28 |+-----------------+......

安小乐
2分钟前
0
0
c++多线程锁 Mutex  自动判断死锁

c++多线程锁可以使用absl::Mutex std::mutex这两种,下面是demo代码。 使用absl:Mutex的时候打印: [mutex.cc : 1338] RAW: Cycle: [mutex.cc : 1352] RAW: mutex@0x683b68 stack: @ 0x43856......

青黑
20分钟前
0
0
Blockathon2018(成都站)比赛落幕,留给我们这些区块链应用思考

9月14日,HiBlock区块链社区主办的第二届Blockathon在成都菁融国际广场成功举行,30名参赛者分为5支队伍在48小时内完成区块链项目的创意、开发及路演,经过紧张的开发及现场评选,最终币托(...

HiBlock
25分钟前
0
0
71.告警系统主脚本 配置文件 监控项目

20.20 告警系统主脚本(main.sh) 20.21 告警系统配置文件 20.22 告警系统监控项目 20.20 告警系统主脚本(main.sh): ~1.约定:把以后所有的shell脚本放在/usr/local/sbin下,也方便我们查...

王鑫linux
32分钟前
0
0
装饰者模式

装饰者模式 Q:何为装饰模式? ()地给一个对象添加一些额外的(),并且()时,并不影响原对象。扩展功能来说,装饰器模式相比生成子类更为灵活。 Q:使用场景? 1.想要在不影响其他对象的情况下...

阿元
53分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部