最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

htmlcleaner使用方法及xpath語法初探

 更新時間:2015年08月04日 16:03:52   投稿:mdxy-dxy  
HtmlCleaner是一個開源的Java語言的Html文檔解析器。HtmlCleaner能夠重新整理HTML文檔的每個元素并生成結(jié)構(gòu)良好(Well-Formed)的 HTML 文檔

在編程的時候或者寫網(wǎng)絡(luò)爬蟲的時候,經(jīng)常需要對html進(jìn)行解析,抽取其中有用的數(shù)據(jù)。一款好的工具是特別有用的,能提供很多的幫助,網(wǎng)上有很多這樣的工具,比如:htmlcleaner、htmlparser

經(jīng)使用比較:感覺 htmlcleaner 比 htmlparser 好用,尤其是htmlcleaner 的 xpath特好用。

下面針對htmlcleaner進(jìn)行舉例說明,需求為:取出title,name=”my_href” 的鏈接,div的class=”d_1″下的所有l(wèi)i內(nèi)容。

一、HtmlCleaner使用:

1、HtmlCleaner

HtmlCleaner是一個開源的Java語言的Html文檔解析器。HtmlCleaner能夠重新整理HTML文檔的每個元素并生成結(jié)構(gòu)良好(Well-Formed)的 HTML 文檔。默認(rèn)它遵循的規(guī)則是類似于大部份web瀏覽器為創(chuàng)文檔對象模型所使用的規(guī)則。然而,用戶可以提供自定義tag和規(guī)則組來進(jìn)行過濾和匹配。

主頁地址:http://htmlcleaner.sourceforge.net/

下載地址:http://m.fzitv.net/softs/364983.html


2、基本示例,在wikipedia中抓取機(jī)場信息

html-clean-demo.html

html-clean-demo.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns = "http://www.w3.org/1999/xhtml " xml:lang = "zh-CN" dir = "ltr">
<head>
	<meta http-equiv = "Content-Type" content = "text/html; charset=GBK" /> 
	<meta http-equiv = "Content-Language" content = "zh-CN" /> 
	<title>html clean demo </title>
</head>
<body>
<div class = "d_1">
	<ul>
		<li>bar </li>
		<li>foo </li>
		<li>gzz </li>
	</ul>
</div>
<div>
	<ul>
		<li><a name = "my_href" href = "1.html">text-1 </a></li>
		<li><a name = "my_href" href = "2.html">text-2 </a></li>
		<li><a name = "my_href" href = "3.html">text-3 </a></li>
		<li><a name = "my_href" href = "4.html">text-4 </a></li>
	</ul>
</div>
</body>
</html>

HtmlCleanerDemo.java

package com.chenlb;
import java.io.File;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
/**
 * htmlcleaner 使用示例.
 *
 */
public class HtmlCleanerDemo {
	public static void main(String[] args) throws Exception {
		HtmlCleaner cleaner = new HtmlCleaner();
		TagNode node = cleaner.clean(new File("html/html-clean-demo.html"), "GBK");
		//按tag取.
		Object[] ns = node.getElementsByName("title", true);	//標(biāo)題
		if(ns.length > 0) {
			System.out.println("title="+((TagNode)ns[0]).getText());
		}
		System.out.println("ul/li:");
		//按xpath取
		ns = node.evaluateXPath("http://div[@class='d_1']//li");
		for(Object on : ns) {
			TagNode n = (TagNode) on;
			System.out.println("\ttext="+n.getText());
		}
		System.out.println("a:");
		//按屬性值取
		ns = node.getElementsByAttValue("name", "my_href", true, true);
		for(Object on : ns) {
			TagNode n = (TagNode) on;
			System.out.println("\thref="+n.getAttributeByName("href")+", text="+n.getText());
		}
	}
}

cleaner.clean()中的參數(shù),可以是文件,可以是url,可以是字符串內(nèi)容。比較常用的應(yīng)該是evaluateXPath、 getElementsByAttValue、getElementsByName方法了。另外說明下,htmlcleaner 對不規(guī)范的html兼容性比較好。

在wikipedia中抓取機(jī)場信息

import java.io.UnsupportedEncodingException;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.TagNode;
import org.htmlcleaner.XPatherException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
//import com.moore.index.BabyStory;
import com.moore.util.HttpClientUtil;
/**
 * 用途:TODO
 * 
 * @author bbdtek
 */
public class ParserAirport {
	private static Logger log = LoggerFactory.getLogger(ParserAirport.class);
	/**
	 * @param args
	 * @throws UnsupportedEncodingException
	 * @throws XPatherException
	 */
	public static void main(String[] args) throws UnsupportedEncodingException,
			XPatherException {
		String url = "http://zh.wikipedia.org/wiki/%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E6%9C%BA%E5%9C%BA%E5%88%97%E8%A1%A8";
		String contents = HttpClientUtil.getUtil().getCon(url);
		HtmlCleaner hc = new HtmlCleaner();
		TagNode tn = hc.clean(contents);
		String xpath = "http://div[@class='mw-content-ltr']//table[@class='wikitable + sortable']//tbody//tr[@align='right']";
		Object[] objarr = null;
		objarr = tn.evaluateXPath(xpath);
		if (objarr != null && objarr.length > 0) {
			for (Object obj : objarr) {
				TagNode tntr = (TagNode) obj;
				String xptr = "http://td[@align='left']//a";
				Object[] objarrtr = null;
				objarrtr = tntr.evaluateXPath(xptr);
				if (objarrtr != null && objarrtr.length > 0) {
					for (Object obja : objarrtr) {
						TagNode tna = (TagNode) obja;
						String str = tna.getText().toString();
						log.info(str);
					}
				}
			}
		}
	}
}

二、XPath初探

1、XPath簡介:

XPath 是一門在 XML 文檔中查找信息的語言。XPath 可用來在 XML 文檔中對元素和屬性進(jìn)行遍歷。

2、XPath節(jié)點選取


XPath 使用路徑表達(dá)式在 XML 文檔中選取節(jié)點。節(jié)點是通過沿著路徑或者 step 來選取的。

下面列出了最有用的路徑表達(dá)式:

表達(dá)式 描述
nodename 選取此節(jié)點的所有子節(jié)點。
/ 從根節(jié)點選取。
// 從匹配選擇的當(dāng)前節(jié)點選擇文檔中的節(jié)點,而不考慮它們的位置。
. 選取當(dāng)前節(jié)點。
.. 選取當(dāng)前節(jié)點的父節(jié)點。
@ 選取屬性。

一些常用表達(dá)式

路徑表達(dá)式 結(jié)果
/bookstore/book[1] 選取屬于 bookstore 子元素的第一個 book 元素。
/bookstore/book[last()] 選取屬于 bookstore 子元素的最后一個 book 元素。
/bookstore/book[last()-1] 選取屬于 bookstore 子元素的倒數(shù)第二個 book 元素。
/bookstore/book[position()<3] 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。
//title[@lang] 選取所有擁有名為 lang 的屬性的 title 元素。
//title[@lang='eng'] 選取所有 title 元素,且這些元素?fù)碛兄禐?eng 的 lang 屬性。
/bookstore/book[price>35.00] 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00。
/bookstore/book[price>35.00]/title 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00。

相關(guān)文章

  • java中的this引用及對象構(gòu)造初始化

    java中的this引用及對象構(gòu)造初始化

    這篇文章主要介紹了java中的this引用及對象構(gòu)造初始化,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • Spring中DeferredResult異步處理

    Spring中DeferredResult異步處理

    DeferredResult是Spring中處理異步請求的強(qiáng)大工具,可以幫助改善應(yīng)用程序的性能和用戶體驗,本文就來介紹一下Spring中DeferredResult異步處理,感興趣的可以了解一下
    2023-12-12
  • java多線程編程之InheritableThreadLocal

    java多線程編程之InheritableThreadLocal

    這篇文章主要為大家詳細(xì)介紹了java多線程編程之InheritableThreadLocal,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Kotlin開發(fā)Android應(yīng)用實例詳解

    Kotlin開發(fā)Android應(yīng)用實例詳解

    這篇文章主要介紹了Kotlin開發(fā)Android應(yīng)用實例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-05-05
  • 什么是Java自旋鎖

    什么是Java自旋鎖

    這篇文章主要介紹了什么是Java自旋鎖,在有些場景中,同步資源的鎖定時間很短,為了這一小段時間去切換線程,線程掛起和恢復(fù)現(xiàn)場的花費可能會讓系統(tǒng)得不償失,下面來了解具體內(nèi)容介紹吧
    2022-01-01
  • spring后置通知@AfterReturning的使用

    spring后置通知@AfterReturning的使用

    這篇文章主要介紹了spring后置通知@AfterReturning的使用方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Vert-x-通過異步的方式使用JDBC連接SQL

    Vert-x-通過異步的方式使用JDBC連接SQL

    在這篇文章中,我們將會看到怎樣在vert.x應(yīng)用中使用HSQL,當(dāng)然也可以使用任意JDBC,以及使用vertx-jdbc-client提供的異步的API,這篇文章的代碼在github
    2016-01-01
  • Java代碼實現(xiàn)Map和Object互轉(zhuǎn)及Map和Json互轉(zhuǎn)

    Java代碼實現(xiàn)Map和Object互轉(zhuǎn)及Map和Json互轉(zhuǎn)

    這篇文章主要介紹了Java代碼實現(xiàn)map和Object互轉(zhuǎn)及Map和json互轉(zhuǎn)的相關(guān)資料,需要的朋友可以參考下
    2016-05-05
  • Spring如何自定義加載配置文件(分層次加載)

    Spring如何自定義加載配置文件(分層次加載)

    這篇文章主要介紹了Spring如何自定義加載配置文件(分層次加載)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序

    Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序

    快速排序是一種常用的基于比較的排序算法,下面這篇文章主要給大家介紹了關(guān)于Java中快速排序優(yōu)化技巧之隨機(jī)取樣、三數(shù)取中和插入排序的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09

最新評論

中西区| 化隆| 蕉岭县| 诸暨市| 新竹市| 工布江达县| 静海县| 米泉市| 德兴市| 禄劝| 醴陵市| 青河县| 定南县| 平塘县| 宁远县| 甘孜县| 元阳县| 化德县| 勃利县| 永嘉县| 邯郸市| 明溪县| 山西省| 安义县| 辽宁省| 巴林左旗| 新昌县| 元江| 堆龙德庆县| 固安县| 柳林县| 临泽县| 万源市| 庆元县| 南华县| 广德县| 乐亭县| 思茅市| 临西县| 平远县| 永德县|