文档章节

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

大数据之路
 大数据之路
发布于 2012/10/17 02:28
字数 769
阅读 1489
收藏 9
点赞 0
评论 0

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

最近刚好看到 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

共有 人打赏支持
大数据之路
粉丝 1485
博文 516
码字总数 344497
作品 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和java哈希值区分

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

天善智能
06/25
0
0
33款可用来抓数据的开源爬虫软件工具

要玩大数据,没有数据怎么玩?这里推荐一些33款开源爬虫软件给大家。 爬虫,即网络爬虫,是一种自动获取网页内容的程序。是搜索引擎的重要组成部分,因此搜索引擎优化很大程度上就是针对爬虫...

Airship
2015/11/09
0
1
Java爬虫框架 - SeimiCrawler

SeimiCrawler An agile,powerful,distributed crawler framework. SeimiCrawler的目标是成为Java世界最好用最实用的爬虫框架。 简介 SeimiCrawler是一个敏捷的,独立部署的,支持分布式的Jav...

无极小子
2015/11/10
0
5
Python是如何怼翻其他编程语言而窜上宝座的

来PK啊! 谁怕谁啊! 在过去的两年间,Python一路高歌猛进,成功窜上“最火编程语言”的宝座。 更可怕的是,这把火不仅仅是在程序员的圈子里越烧越旺,甚至还烧到了程序员的圈子外,从小学生...

超级数学建模
04/18
0
0
Python开发(基础):初识Python

Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quo...

wbb827
07/03
0
0
多语言跨平台远程过程调用【Avro】

开始 Avro是Apache的Hadoop家族的项目之一。具有性能高、基本代码少和产出数据量精简等特点。不过这是他们宣传广告,我最近也分别研究了Avro和Protobuf。基本的测试代码,不吐不快。 安装 Ja...

震秦
2013/08/07
0
7
在C++软件中嵌入python解释器

Python简介 Python是一种简单易学,功能强大的解释型编程语言,它有简洁明了的语法,高效率的高层数据结构,能够简单而有效地实现面向对象编程,特别适用于快速应用程序开发,也可以用来开发...

openthings
2015/01/21
0
0
慕课网Spark SQL日志分析 - 5.DateFrame&Dataset

5.DateFrame&Dataset 1.DateFrame产生背景 DataFrame 不是Spark Sql提出的。而是在早起的Python、R、Pandas语言中就早就有了的。 Spark诞生之初一个目标就是给大数据生态圈提供一个基于通用语...

Meet相识_bfa5
07/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

mybatis中session.getMapper方法源码分析

0开始代码AuthorMapper mapper = session.getMapper(AuthorMapper.class); 1 DefaultSqlSession类 @Override public <T> T getMapper(Class<T> type) { //最后会去调用MapperRegistry.getMap......

writeademo
5分钟前
0
0
spring cloud zuul网关的作用

zuul一般有两大作用,1是类似于Nginx的网址重定向,但zuul的重定向的一般是整个spring cloud里在Eureka注册中心的模块. zuul: ignored-services: '*' sensitiveHeaders: routes: ...

算法之名
5分钟前
2
0
java按比例之原图生成缩略图

package com.wxp.test; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.imageio.ImageIO; import sun.......

恋码之子
15分钟前
0
0
SpringCloud 微服务 (十五) 服务容错 Hystrix

壹 工作中的微服务架构,某个服务通常会被多个服务调用或者多层调用完成需求,如果某个服务不可用,导致一个系统功能不可用或者服务直接没用了的情况,这种情况称为雪崩效应 有A服务调用B服务,B服...

___大侠
17分钟前
0
0
Spring框架中的设计模式(五)

Spring框架中的设计模式(五) 通过以前的4篇文章,我们看到Spring采用了大量的关于创建和结构方面的设计模式。本文将描述属于行为方面的两种设计模式:命令和访问者。 前传: Spring框架中的...

瑞查德-Jack
20分钟前
0
0
解决phpstorm运行很卡问题!

phpStorm一旦达到这个临界值,所有智能提示、自动补全都失效了 这TM就很尴尬了,顿时感觉自己就是个废人了,纯手写代码跟便秘一样 众所周知phpStorm基于JAVA,那么这个内存限制肯定跟JAVA的虚...

sjcehui2010
22分钟前
0
0
javascript前端AES加密解密

参考了一下网上的代码加上自已的一些想法,修改,key也可以是中文, 要引入一个aes.js的js文件。 html代码 <html> <head> <title>AES加解密</title> <meta http-equiv="Content-Type"......

oisan_
26分钟前
0
0
MacOS和Linux内核的区别

有些人可能认为MacOS和Linux内核有相似之处,因为它们可以处理类似的命令和类似的软件。甚至有人认为苹果的MacOS是基于linux的。事实上,这两个内核的历史和特性是非常不同的。今天,我们来看...

六库科技
30分钟前
0
0
Vue.js-自定义事件例子

自定义组件的 v-model 2.2.0+ 新增 一个组件上的 v-model 默认会利用名为 value 的 prop 和名为 input 的事件,但是像单选框、复选框等类型的输入控件可能会将 value 特性用于不同的目的。m...

tianyawhl
33分钟前
0
0
RobotThread.cpp

#include "RobotThread.h"RobotThread::RobotThread(int argc, char** pArgv, const char * topic) :m_Init_argc(argc), m_pInit_argv(pArgv), m_topic(topic){/** ......

itfanr
36分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部