htmlparser源碼
❶ 如何使用htmlparser提取網頁文本信息
HTMLParser具有小巧,快速的優點,缺點是相關文檔比較少(英文的也少),很多功能需要自己摸索。對於初學者還是要費橋頌一些功夫的,而一旦上手以後,會發現HTMLParser的結構設計很巧妙,非常實用蘆消腔,基本各種需求都可以滿足。比如問題中提到的提取網頁文本信息。
用以下代碼來實現提取網頁文本信息
// 提取網頁主陪衫要文本內容
public String getContent(){
content=(isHub())?getHubEntries():getTopicBlock();
System.out.println("<Content>:");
System.out.println("=========================");
System.out.println(content);
return content;
}
// 提取Hub類網頁文本內容,如yahoo,sina等門戶網
public String getHubEntries(){
StringBean bean=new StringBean();
bean.setLinks(false);
bean.setReplaceNonBreakingSpaces(true);
bean.setCollapse(true);
try {
parser.visitAllNodesWith(bean);
} catch (ParserException e) {
System.err.println("getHubEntries()-->"+e);
}
parser.reset();
return bean.getStrings();
}
// 獲取主題性(Topical)網頁文本內容:對於博客等以文字為主體的網頁效果較好
public String getTopicBlock(){
HasParentFilter acceptedFilter=new HasParentFilter(new TagNameFilter("p"));
NodeList nodes=null;
try {
nodes=parser.extractAllNodesThatMatch(acceptedFilter);
} catch (ParserException e) {
System.err.println("getTopicBlock"+e);
}
StringBuffer sb=new StringBuffer();
SimpleNodeIterator iter=nodes.elements();
while(iter.hasMoreNodes()){
Node node=iter.nextNode();
sb.append(node.getText()+"\n");
}
parser.reset();
return sb.toString();
}
另外,要知道的是
HTMLParser的核心模塊是org.htmlparser.Parser類,這個類實際完成了對於HTML頁面的分析工作。這個類有下面幾個構造函數:
public Parser ();
public Parser (Lexer lexer, ParserFeedback fb);
public Parser (URLConnection connection, ParserFeedback fb) throws ParserException;
public Parser (String resource, ParserFeedback feedback) throws ParserException;
public Parser (String resource) throws ParserException;
public Parser (Lexer lexer);
public Parser (URLConnection connection) throws ParserException;
和一個靜態類public static Parser createParser (String html, String charset);
提供幾個常用的
對於樹型結構進行遍歷的函數,這些函數最容易理解:
Node getParent ():取得父節點
NodeList getChildren ():取得子節點的列表
Node getFirstChild ():取得第一個子節點
Node getLastChild ():取得最後一個子節點
Node getPreviousSibling ():取得前一個兄弟(不好意思,英文是兄弟姐妹,直譯太麻煩而且不符合習慣,對不起女同胞了)
Node getNextSibling ():取得下一個兄弟節點
取得Node內容的函數:
String getText ():取得文本
String toPlainTextString():取得純文本信息。
String toHtml () :取得HTML信息(原始HTML)
String toHtml (boolean verbatim):取得HTML信息(原始HTML)
String toString ():取得字元串信息(原始HTML)
Page getPage ():取得這個Node對應的Page對象
int getStartPosition ():取得這個Node在HTML頁面中的起始位置
int getEndPosition ():取得這個Node在HTML頁面中的結束位置
用於Filter過濾的函數:
void collectInto (NodeList list, NodeFilter filter):基於filter的條件對於這個節點進行過濾,符合條件的節點放到list中。
用於Visitor遍歷的函數:
void accept (NodeVisitor visitor):對這個Node應用visitor
用於修改內容的函數,這類用得比較少:
void setPage (Page page):設置這個Node對應的Page對象
void setText (String text):設置文本
void setChildren (NodeList children):設置子節點列表
其他函數:
void doSemanticAction ():執行這個Node對應的操作(只有少數Tag有對應的操作)
Object clone ():介面Clone的抽象函數。
以上知識可以完整處理HTML頁面的所有內容
參考資料:
htmlparser官方網站下載地址
http://www.htmlparser.sourceforge.net/
❷ birt用HtmlParser導出的格式很亂如何處理
關鍵是html里無用的空格被birt使用了,所以做html盡力把空格都刪除早啟,祥睜局或者修改一下birt的源碼:com/lowagie/text/xml/SAXiTextHandler.java 將其中的在void characters(char[] ch, int start, int length)方法中,對獲謹讓取的數據去空格即可:currentChunk = new Chunk(buf.toString());
❸ 如何用C語言實現解析HTML文檔
參考下面代碼:
#include <stdio.h>
#include <streamhtmlparser/htmlparser.h>
int main(void)
{
unsigned int getchar_ret;
htmlparser_ctx *parser = htmlparser_new();
while ((getchar_ret = getchar()) != EOF) {
char c = (char)getchar_ret;
/* If we received a '$' character, we output the current tag and attribute
* * name to stdout. */
if (c == '$') {
printf("[[ ");
if (htmlparser_tag(parser)) printf("tag=%s ", htmlparser_tag(parser));
if (htmlparser_attr(parser)) printf("attr=%s ", htmlparser_attr(parser));
printf("]]");
/* If we read any other character, we pass it to the parser and echo it to
* * stdout. */
} else {
htmlparser_parse_chr(parser, c);
putchar(c);
}
}
}
❹ java怎樣讀取html文件
java可以使用jsoup、htmlparser等工具進行html的讀取和解析,以下是詳細說明:
1、jsoup 是一款 Java 的HTML 解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套判數非常省力的API,可通過DOM,CSS以及類似於JQuery的操作方法來取出和操作數據。據說它是基於MIT協議發布的。
jsoup的主要功能如下:
從一個URL,文件或字元串中解析HTML;
使用DOM或CSS選擇器來查找、取出數據;
可操作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=HTMLParser;http://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 ());
❺ java中幾種解析html的工具
HTML分析是一個比較復雜的工作,Java世界主要有幾款比較方便的分析工具:
1.Jsoup
Jsoup是一個集強大和便利於一體的HTML解析工具。它方便的地方是,可以用於支持用jQuery中css selector的方式選取元素,這對於熟悉js的開發者來說基本沒有學習成本。
String content = "blabla";
Document doc = JSoup.parse(content);
Elements links = doc.select("a[href]");
- InputStream inputStream = null;
- HtmlParser htmlParser = new HtmlParser();
- htmlParser.parse(new ByteArrayInputStream(page.getContentData()),
- contentHandler, metadata, new ParseContext());
Jsoup還支持白名單過濾機制,對於網站防止XSS攻擊也是很好的。
2.HtmlParser
HtmlParser的功能比較完備,也挺靈活,但談不上方便。這個項目很久沒有維護了,最新版本是2.1。HtmlParser的核心元素是Node,對應一個HTML標簽,支持getChildren()等樹狀遍歷方式。HtmlParser另外一個核心元素是NodeFilter,通過實現NodeFilter介面,可以對頁面元素進行篩選。這里有一篇HtmlParser的使用文章:使用 HttpClient 和 HtmlParser 實現簡易爬蟲。
3.Apache tika
tika是專為抽取而生的工具,還支持PDF、Zip甚至是JavaClass。使用tika分析HTML,需要自己定義一個抽取內容的Handler並繼承org.xml.sax.helpers.DefaultHandler,解析方式就是xml標準的方式。crawler4j中就使用了tika作為解析工具。SAX這種流式的解析方式對於分析大文件很有用,我個人倒是認為對於解析html意義不是很大。
4.HtmlCleaner與XPath
HtmlCleaner最大的優點是:支持XPath的方式選取元素。XPath是一門在XML中查找信息的語言,也可以用於抽取HTML元素。XPath與CSS Selector大部分功能都是重合的,但是CSS Selector專門針對HTML,寫法更簡潔,而XPath則是通用的標准,可以精確到屬性值。XPath有一定的學習成本,但是對經常需要編寫爬蟲的人來說,這點投入絕對是值得的。
❻ 如何用htmlparser修改html中標簽的內容
測試文本一<input name="\"text1\/" type="\"text\" value="\"text1\">測試文本二其他數據;\"; Parser parser = new Parser(); // parser.setURL parser.setInputHTML(sText); parser.setEncoding(parser.getEncoding()); NodeFilter filter = new NodeClassFilter(Span.class); NodeList list = parser.extractAllNodesThatMatch(filter); for (int i = 0; i < list.size(); i++) { if (list.elementAt(i) instanceof Span) { Span spanTag = (Span ) list.elementAt(i); textnode.setAttributeEx(textnode.getAttributeEx("name")); �0�2�0�2�0�2�0�2 �0�2 if(spanTag .getAttribute("沒吵銀name").equals("first")){ �0�2�0�2�0�2�0�2�0�2 �0�2 spanTag .setAttribute("value", "bbb"); �0�2�0�2�0�2�0�2�0�2 } } }�0�2我已經用span過濾掉了其他內容,部分源碼如上,我現在想將上面文本中的標簽中的name="first"的value值改為"bbb",然後返回所有文本即改過的(sText),但是不能用sText.replace()方法,因為原文本中可能有多個value="aaa"的值.�0�2大枯宴家有什麼好的建議,最好是直接可以用htmlparser處理的.謝謝問題補充:非常感謝大家的幫忙,尤其是lzj0470和ferreousbox,上面的問題已經解決, 如果現在我想將字元串"測試文本一<input name="text1/" type="text" value="text1">測試文本二其他數據;" 中的"測試文本二"替換成"此處已經被替換";即返回的字元串為碰余:
❼ htmlparser取<td>節點的子節點<img /> ImageTag imageTag = (ImageTag) td[k].getFirstChild ();
異常處理來測試
❽ 用htmlparser 怎麼實現抓取這個網址的所有分頁的電影信息。
網頁的內容由JS生成,先看數據是不是包含在JS或者冊廳者頁面源碼中,如果在,可用htmlparser獲取,如果是通過州薯Ajax獲取的數據伏耐,那需要找到Ajax獲取數據的地址再通過htmlparser獲取需要的數據。
另外,新的JDK中包含有可以執行js代碼的功能,利用這一功能,可以獲取js執行後的部分數據。
❾ 用htmlparser獲取百度百科首頁strong標簽中的內容
「用htmlparser獲取網路首頁」相關的解決方案進行了整理,用戶詳細問題包括:://ke; ; + node.parse(new TagNameFilter(" i <);;
for (int i = 0; i++) {
Node node = nodeList;UTF-8".size();
Parser parser = new Parser((HttpURLConnection)(new URL(url)).com/"
NodeList nodeList = parser;strong"
parser.outString url = ".elementAt(i);)).setEncoding(".com/" target="_blank">http; System.openConnection()); nodeList..toPlainTextString())://ke.println(i + ": ",具體解決方案如下:
解決方案1:
HtmlPage page = new HtmlPage(parser); nodelist;
for (int i = 0,java版本類似;
NodeFilter filter = new TagNameFilter("。它能超高速解析html;);}
NodeList nodelist = page.VisitAllNodesWith(page);<。
無論你是想抓取網頁數據還是改造html的內容;HTML>.0.;"HTML>GBK",用了htmlparser絕對會忍不住稱贊,把本來亂七八糟的HTML信息格式化
· 轉成XML格式數據
編輯本段htmlparser常用代碼
取得一段html代碼裡面所有的鏈接C#版本..; i <,例如對HTML進行有效信息搜索
· 鏈接提取;AAA</<BODY>:
string htmlcode = "。
毫不誇張地說, true),可以用來過濾網頁上一些令人不愉快的字詞
· HTML信息清洗;);<,用於自動給頁面的鏈接文本加上鏈接的標簽
· 資源提取.ElementAt(i);
try
{ parser;<
nodelist = nodelist;/,它不依賴於其它的java庫文件,用於檢查HTML中的灶斗纖鏈接是否有效
· 頁面內容的監控
2. 信息轉換
· 鏈接重寫;
System;/.Body. + "。現在htmlparser最新版本為2;<,例如對一些圖片;
Parser parser = Parser;);<,用於將網頁內容保存到本地
· 內容檢驗,而且不會出錯, ".ExtractAllNodesThatMatch(filter.Console.;/TITLE>HEAD>HEAD>.,主要用於改造或
提取html;A""、聲音的資源的處理
· 鏈接檢查;TITLE>n",用於修改頁面中的所有超鏈接
· 網頁內容拷貝.Size(),htmlparser就銷轎是目前最好的html解析和分析的工具; i++)
{
LinkTag link=(LinkTag) nodelist;\< + ;) + ".CreateParser(htmlcode。
編輯本段htmlparser基本功能
1. 信息提取
· 文本信息抽取;href".Write(link.GetAttribute("}
catch (ParserException e1)
{ e1 = null;BODY>htmlparser
目錄
簡介
htmlparser基本功能
htmlparser常用代碼
編輯本段簡介
htmlparser[1]是一個純的java寫的html解析的庫
解決方案2:
. 信息提隱仿取
· 文本信息抽取;/
HtmlPage page = new HtmlPage(parser);<)..Write(link;
nodelist = nodelist;\ i++)
{
LinkTag link=(LinkTag) nodelist;<,java版本類似;/ i <BODY>:
string htmlcode = ",可以用來過濾網頁上一些令人不愉快的字詞
· HTML信息清洗.Size();
try
{ parser;
NodeFilter filter = new TagNameFilter("HTML>);<HTML>TITLE>BODY>href",例如對一些圖片;<, true).GetAttribute("</、聲音的資源的處理
· 鏈接檢查;;A".Body,例如對HTML進行有效信息搜索
· 鏈接提取,用於將網頁內容保存到本地
· 內容檢驗;".CreateParser(htmlcode.Console; nodelist;}
NodeList nodelist = page,把本來亂七八糟的HTML信息格式化
· 轉成XML格式數據
編輯本段htmlparser常用代碼
取得一段html代碼裡面所有的鏈接C#版本...ExtractAllNodesThatMatch(filter;
for (int i = 0;HEAD>AAA<,用於自動給頁面的鏈接文本加上鏈接的標簽
· 資源提取, "}
catch (ParserException e1)
{ e1 = null.VisitAllNodesWith(page);",用於修改頁面中的所有超鏈接
· 網頁內容拷貝;
Parser parser = Parser;HEAD>);GBK"/<<. + "TITLE>..; + ,用於檢查HTML中的鏈接是否有效
· 頁面內容的監控
2. 信息轉換
· 鏈接重寫;
System;n") + ".ElementAt(i) 展開
❿ 求教大神關於java獲取網頁源碼的問題 大神速來
htmlparser.框架,是解析網頁的。
htmlparser是一個純的java寫的html解析的庫,它不依賴於其它的java庫文件,主要用於改造或
提取html。它能超高速解析html,而且不會出錯。現在htmlparser最新版本為2.0。
毫不誇張地說,htmlparser就是目前最好的html解析和分析的工具。
無論你是想抓取網頁數據還是改造html的內滾鏈如容,用了htmlparser絕對會忍不住稱贊。
jsoup也是。
Java 程序在解析HTML 文檔時,相信大家都大啟接觸過htmlparser 這個開源項目,我曾經在IBM DW
上發表過兩篇關於htmlparser 的文喚唯章,分別是:從HTML中攫取你所需的信息 和擴展HTMLParser
對自定義標簽的處理能力。但現在我已經不再使用htmlparser 了,原因是htmlparser 很少更新,但最重要的是有了jsoup 。