HTML解析

1,http://blog.csdn.net/fover717/article/details/8314217

 

JSoup

jsoup Cookbook(中文版)

入门

  1. 解析和遍历一个html文档

输入

  1. 解析一个html字符串
  2. 解析一个body片断
  3. 根据一个url加载Document对象
  4. 根据一个文件加载Document对象

数据抽取

  1. 使用dom方法来遍历一个Document对象
  2. 使用选择器语法来查找元素
  3. 从元素集合抽取属性、文本和html内容
  4. URL处理
  5. 程序示例:获取所有链接

数据修改

  1. 设置属性值
  2. 设置元素的html内容
  3. 设置元素的文本内容

html清理

  1. 消除不受信任的html (来防止xss攻击)

 

2,http://www.cnblogs.com/NetSos/archive/2010/11/29/1891194.html

 

HTML解析原理

  标准的web前端工程师需要知道 ◎浏览器(或者相应播放器)的渲染/重绘原理

  这我得加把劲了。我还真的说的不是很清楚,我就G下,结果不是很多,找到了有一个,就记下来了。。。

  以下部分来自handawei-javaeye的blog:

 

  Web页面运行在各种各样的浏览器当中,浏览器载入、渲染页面的速度直接影响着用户体验
  简单地说,页面渲染就是浏览器将html代码根据CSS定义的规则显示在浏览器窗口中的这个过程。先来大致了解一下浏览器都是怎么干活的:
  1. 用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
  2. 浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
  3. 浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
  4. 浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
  5. 浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
  6. 服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器需要回过头来重新渲染这部分代码;
  7. 浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
  8. Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
  9. 终于等到了</html>的到来,浏览器泪流满面……
  10. 等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
  11. 浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请
  求了新的CSS文件,重新渲染页面。

 

 

  浏览器每天就这么来来回回跑着,要知道不同的人写出来的html和css代码质量参差不齐,说不定哪天跑着跑着就挂掉了。好在这个世界还有这么一群人——页面重构工程师,平时挺不起眼,也就帮视觉设计师们切切图啊改改字,其实背地里还是干了不少实事的。

说到页面为什么会慢?那是因为浏览器要花时间、花精力去渲染,尤其是当它发现某个部分发生了点变化影响了布局,需要倒回去重新渲染内行称这个回退的过程叫reflow。

页面渲染


 

   reflow几乎是无法避免的。现在界面上流行的一些效果,比如树状目录的折叠、展开(实质上是元素的显示与隐藏)等,都将引起浏览器的 reflow。鼠标滑过、点击……只要这些行为引起了页面上某些元素的占位面积、定位方式、边距等属性的变化,都会引起它内部、周围甚至整个页面的重新渲染。通常我们都无法预估浏览器到底会reflow哪一部分的代码,它们都彼此相互影响着。

repaint 重绘

   reflow问题是可以优化的,我们可以尽量减少不必要的reflow。比如开头的例子中的<img>图片载入问题,这其实就是一个可以避免的reflow——给图片设置宽度和高度就可以了。这样浏览器就知道了图片的占位面积,在载入图片前就预留好了位置。

另外,有个和reflow看上去差不多的术语:repaint,中文叫重绘。如果只是改变某个元素的背景色、文字颜色、边框颜色等等不影响它周围或内部布局的属性,将只会引起浏览器repaint。repaint的速度明显快于reflow(在IE下需要换一下说法,reflow要比repaint 更缓慢)。下次将通过一系列的实验说明在Firefox、IE等浏览器下reflow的优化。

 

3,http://blog.csdn.net/lubeijing2008xu/article/details/8019712

 

 

Java中常用html解析器

 

标签: html解析器javahtmlstring文档jquery

 

 

可能我们在项目中常用Dom解析html,但是以下介绍的解析器可能会让你更简单、容易去解析html。另外javaweb中常用的dom解析是 dom4j, 它在web领域中地王道;android中我们常用的是sax、pull。因为它们更省内存。因为不需要将整个XML树读入内存后再进行处理,而是通过输 入流的方式进行,在这过程中会触发相关事件........在这些事件回调中我们去做解析工作。

 


 

1、jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。据说它是基于MIT协议发布的。

 

            在线文档:http://www.osctools.net/apidocs/apidoc?api=jsoup-1.6.3http://jsoup.org/

 

jsoup的主要功能如下:

 

  1. 从一个URL,文件或字符串中解析HTML;
  2. 使用DOM或CSS选择器来查找、取出数据;
  3. 可操作HTML元素、属性、文本;

 


 

示例代码:

Document doc = Jsoup.parse(input, "UTF-8", "http://www.dangdang.com");
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}


 

2、htmlparser是一个纯的java写的html解析的库,它不依赖于其它的java库文件,主要用于改造或提取html。它能超高速解析 html,而且不会出错。现在htmlparser最新版本为2.0。 据说htmlparser就是目前最好的html解析和分析的工具。  无论你是 想抓取网页数据还是改造html的内容,用了htmlparser绝对会忍不住称赞。

在线文档: http://www.osctools.net/apidocs/apidoc?api=HTMLParserhttp://htmlparser.sourceforge.net/project-info.html

示例代码:
Parser parser = new Parser ("http://www.dangdang.com");
NodeList list = parser.parse (null);
Node node = list.elementAt (0);
NodeList sublist = node.getChildren ();
System.out.println (sublist.size ());


当然,除了这两个还有NekoHTML、JTidy、HtmlCleaner等等。另外在C++中的有htmlcxx。

 

4,

 

HTML Parser 是一个对HTML进行分析的快速实时的解析器,最新的发行版本是1.6,另外2.0的开发版本已经两年没有进展了。

示例代码:

 Parser parser = new Parser ("http://whatever");
NodeList list = parser.parse (null);
Node node = list.elementAt (0);
NodeList sublist = node.getChildren ();
System.out.println (sublist.size ());

Javadoc:http://www.ostools.net/apidocs/apidoc?api=HTMLParser

 

 

5,

 

jsoup 是一款 Java 的HTML 解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。

jsoup的主要功能如下:

  1. 从一个URL,文件或字符串中解析HTML;

  2. 使用DOM或CSS选择器来查找、取出数据;

  3. 可操作HTML元素、属性、文本;

jsoup是基于MIT协议发布的,可放心使用于商业项目。

示例代码:

1
2
3
4
5
6
7
8
9
File input = new File("/tmp/input.html");
Document doc = Jsoup.parse(input, "UTF-8""http://example.com/");
 
Element content = doc.getElementById("content");
Elements links = content.getElementsByTag("a");
for (Element link : links) {
  String linkHref = link.attr("href");
  String linkText = link.text();
}

在线Javadoc:http://tool.oschina.net/apidocs/apidoc?api=jsoup-1.6.3

 

6,

1
2
3
4
5
6
7
8
9
10
// Run some jQuery on a html fragment
var jsdom = require("jsdom");
 
jsdom.env(
  '<p><a class="the-link" href="https://github.com/tmpvar/jsdom">jsdom!</a></p>',
  ["http://code.jquery.com/jquery.js"],
  function (errors, window) {
    console.log("contents of a.the-link:", window.$("a.the-link").text());
  }
);
 
 
// Count all of the links from the io.js build page
var jsdom = require("jsdom");
 
jsdom.env(
  "https://iojs.org/dist/",
  ["http://code.jquery.com/jquery.js"],
  function (errors, window) {
    console.log("there have been", window.$("a").length - 4, "io.js releases!");
  }
);
 
 
7,
 

使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用

分类:

目录(?)[+]

 


 

日期:2012-7-20  来源:GBin1.com

使用java的html解析器jsoup和jQuery实现一个自动重复抓取任意网站页面指定元素的web应用

在线演示  本地下载

如果你曾经开发过内容聚合类网站的话,使用程序动态整合来自不同页面或者网站内容的功能肯定对于你来说非常熟悉。通常使用java的话,我们都会使用到一些HTML的解析,例如,httpparser,最早gbin1.com的整合搜索就是使用httpparser来抓取Google和Baidu的搜索结果,并且整合呈现给搜索用户,这也就是GBin1域名的由来。

那么今天呢,我们介绍另外一个超棒的Java的HTML解析器 - jsoup,这个类库可以帮助大家实时的处理HTML。提供了非常方便的API来提取和处理数据,最重要的它使用类似jQuery的语法来处理DOMCSS等,如果你使用过jQuery的话,就知道它处理DOM的强大方便之处。

主要特性

jsoup实现了WHATWG HTML5 的标准,和现代浏览器解析DOM的方式一样。主要功能:

  • 可以从URL,文件或者字符串中抓取和解析HTML
  • 使用DOM的查询和CSS选择器来查找和解压数据
  • 可以处理HTML的属性,元素和文本
  • 帮助用户处理递交的内容,并且防止XSS攻击
  • 输出干净的HTML

基本上jsoup可以帮助你处理各种的HTML问题,并且帮助你验证非法的tag,创建一个干净的DOM树。

实现一个抓取功能

这里我们将实现一个简单的抓取功能,你只需要指定url,并且指定你需要抓取的特定元素,例如,ID或者class。后台我们将使用jsoup抓取,前台使用jQuery美化生成结果。

大家需要注意以下几点:

  1. <a>的相对路径问题:在你抓取的页面中的链接有可能使用相对路径,你需要处理成绝对路径,否则你在本地服务器上无法正常打开链接
  2. <img> 的相对路径问题:同上,你同样也需要处理转化
  3. <img>的尺寸问题:如果你抓取的图片特别大,你需要使用代码转换成本地样式,这个你也可以选择使用jQuery在前台处理

下载jsoup的jar包后,请加入你的classpath路径,如果你使用jsp,请加入web应用WEB-INF的lib目录中。

Java相关代码如下:

Document doc = Jsoup.connect("http://www.gbin1.com/portfolio/lastest.html").timeout(0).get();
Elements items = doc.select(".includeitem");

以上代码,我们定义jsoup使用一个url来获取HTML,这里使用http://www.gbin1.com/portfolio/lastest.html,这个页面中列出了gbin1最近发布的文章。如果你查看此页面源代码,可以看到,每一个文章都在.includeitem这个class中,因此,我们这里使用doc.select方法来选择对应的class。

注意我们这里调用timeout(0),这意味着持续的请求url,缺省为2000。即2秒后超时。大家可以看到这里使用了类似jQuery的链状调用,非常方便。

for (Element item : items) {
	  Elements links = item.select("a");
	  for(Element link: links){
		  link.attr("href",link.attr("abs:href"));
	  }
	  
	  Elements imgs = item.select("img");
	  for(Element img: imgs){
		  img.attr("src",img.attr("abs:src"));
	  }
	  String html = item.html();
	  out.println("<li class=\"item\">" + html + "</li>");
}

以上代码中,我们处理每一个查询到的includeitem元素。查找"a"和"img",将其中的href元素值修改为绝对路径。

link.attr("abs:href")

以上代码将会得到对应链接的绝对路径,其中属性为abs:href。同理,可以得到图片绝对路径abs:src。

代码运行后,我们可以看到修改完的代码, 将他们放置于li中。

接下来我们开发控制抓取的javascript页面:

在这个页面的实现中,我们使用setInterval方法间隔指定的时间使用ajax调用以上java开发的代码,基本代码如下:

//Run for first time
$('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);
//$('#content').html('');
$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
	$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
})					

以上代码非常简单,我们使用jQuery的load方法来调用siteproxy.jsp,然后取得siteproxy.jsp生成页面中的#result元素,即抓取内容。如果你不熟悉jQueryajax方法,请参考这个系列文章:

jQuery类库新手使用指南之AJAX方法- 第一部分

jQuery类库新手使用指南之AJAX方法- 第二部分

jQuery类库新手使用指南之AJAX方法- 第三部分

jQuery类库新手使用指南之AJAX方法- 第四部分

为了能够让代码指定间隔时间运行抓取,我们将方法放入setinterval中,如下:

runid = setInterval(			
function getInfo(){
	$('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);
	//$('#content').html('');
	$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
		$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
	})
}, interval*1000);

通过以上方法,我们可以在用户触发抓取后,每隔指定时间触发抓取动作。

完整js代码如下:

$(document).ready(function(){
	var url, element, interval, runid;
	$('#start').click(function(){
		url = $('#url').val();
		element = $('#element').val();
		interval = $('#interval').val();				
		
		//Run for first time
		$('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);
		//$('#content').html('');
		$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
			$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
		})					
		
		runid = setInterval(			
		function getInfo(){
			$('#msg').html('请耐心等待, 页面抓取中 ...').fadeIn(400);
			//$('#content').html('');
			$('#content').load('siteproxy.jsp #result', {url:url, elem:element}, function(){
				$('#msg').html('抓取已完成').delay(1500).fadeOut(400);
			})
		}, interval*1000);
	});
	
	$('#stop').click(function(){
		$('#msg').html('抓取已暂停').fadeIn(400).delay(1500);
		clearInterval(runid);
	});
	
});

将以上jsp和html文件部署以后,将可以看到如下界面:

 

 

 

8, http://blog.csdn.net/nic7968/article/details/17349661

posted @ 2015-12-31 18:43  Augustone  阅读(404)  评论(0)    收藏  举报