HTML分析是一個比較復雜的工作,Java世界主要有幾款比較方便的分析工具:
1.jsoup
Jsoup是一個集強大和便利於一體的HTML解析工具。它方便的地方是,可以用於支持用jQuery中css selector的方式選取元素,這對於熟悉js的開發者來說基本沒有學習成本。
String content = "blabla";
Document doc = JSoup.parse(content);
Elements links = doc.select("a[href]");
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有一定的學習成本,但是對經常需要編寫爬蟲的人來說,這點投入絕對是值得的。
⑵ jsoup 可以為一個頁面放入CSS樣式嗎
你說的是jsonp吧。
jsonp只是一種從服務端獲取數據的方式。
你的問題可以拆分回成如下步驟來解決:答
通過jsonp獲取css樣式的文本內容;
通過js在html中創建<style>標簽,把獲取的內容添加進去。
如此樣式就生效了。
⑶ java jsoup 解析html獲取沒有包含的內容
java jsoup 解析html獲取沒有包含的內容
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
public class Test {
public static void main(String[] args) {
String str = "<table><tr><td>user</td><td>cc</td></tr><tr><td>pass</td><td>123</td></tr></table>";
Document doc = Jsoup.parse(str);
Elements trs = doc.select("table").select("tr");
for(int i = 0;i<trs.size();i++){
Elements tds = trs.get(i).select("td");
for(int j = 0;j<tds.size();j++){
String text = tds.get(j).text();
System.out.println(text);
}
}
}
}
⑷ jsoup中element類有操作css的方法嗎
$(".box").css({
"border":"1pxsolid#ccc",
"width":"100px"
});
⑸ 使用Jsoup怎樣解析本地的html文件
Jsoup解析是按照字元串解析的,比如:
Documentdoc=Jsoup.parse(response1Str);
這句傳入的response1Str就是一個String類型。因此你只需把本地html文件作為文本全讀入為一個字元串,然後再用JSoup進一步解析就行了。
有關讀入文件,變成字元串,我剛剛答過一個問題,你可參考一下:
http://..com/question/456256407982905445
剩下的代碼,就是JSoup用類似CSS選擇器的語法,取出你需要的元素,作進一步處理了。
例如:
Elementse2=doc.getElementsByTag("input");
for(Elemente:e2){
if(e.attr("name").equals("formhash")){
formhashStr=e.attr("value");
break;
}
}
System.out.println("formhash="+formhash);上面這個代碼片段是取出具有name屬性為formhash的<input>標簽,並列印此屬性的value值。
建議去JSoup官網了解更詳細的API及功能。
⑹ 用jsoup解析HTML時報錯;java.lang.noclassdeffounderror:org/jsoup/Jsoup
哥們 看在你和我遇到一樣的問題 我就幫你一下 反正我是解決了
java.lang.NoClassDefFoundError: org.jsoup.Jsoup錯誤分析
2012-11-21
在使用Jsoup包時版,權通過在classpath中載入Jsoup1.6.1.jar包形式進行引入,ADT版本:20.0.0.v201206242043-391819,運行時意外退出,出現
1
java.lang.NoClassDefFoundError: org.jsoup.Jsoup錯誤,錯誤指向Jsoup包應用的語句,
1
doc = Jsoup.parse(new URL(urlString), 5000);在反復核對之後,又試用了Jsoup1.6.3.jar包,依然不行,經網上查證,原來是ADT在升級到版本20之後無法載入這個jar包。
解決方案是:引用將現有的引用Build path刪除掉Jsoup.jar包,然後在工程根目錄下建立libs文件夾,注意一定是libs文件夾,而非lib,使用android tools 修復一下工程,然後clean一下工程,refresh重新編譯一下,ok問題解決。
⑺ jsoup 能不能解析function裡面的東西
jsoup的主要功能如下:
1. 從一個URL,文件或字元串中解析HTML;
2. 使用DOM或CSS選擇器來查找、取出數據;
3. 可操作HTML元素、屬性、文本;
如果是頁面的function都可以解析。但寫在伺服器端(js文件里)的function就不可以。
⑻ jsoup怎麼解析javascript動態改變html標簽的屬性值
jsoup可以解析出 js 的文件名,至於 js 文件里的內容,可以用程序下載能得到的,專但這不是屬 jsoup 乾的事。
參考實例如下:
Elements els = doc.select("script");
for(Element el: els) {
//提取src信息
String src = el.attr("src");
//得到js的地址了,就可以下載了。比如外部css樣式表也可以類似的方式取出來
}
⑼ 用過jsoup的來看看,如何抽取style中的css屬性
一般來說不建議直接在對象中直接寫style,建議寫到class中,再以替換class來實現改變樣式
⑽ Java 處理 html Css
有,自定義jstl ,這個非常方便,建議樓主去學習下,例子如下:
當時我要在很多頁面根據值判斷狀態給不一樣的樣式。如果用if-else太麻煩了,每個頁面都要寫,於是就用到了自定義jstl。
導入自定義標簽後在頁面調用:
<%@tagliburi="/tags/cos-cstatus"prefix="cs"%>
<td>
<cs:cstatusvalue="${item.the_consolidated_status}"/>
</td>
代碼:
@Override
publicintdoEndTag()throwsJspException{
try{
if(value==null||value.length()==0){
pageContext.getOut().print("");
}elseif("Normal".equalsIgnoreCase(value)){
pageContext.getOut().print("<spanclass='label'>"+value+"</span>");
}elseif("Warning".equalsIgnoreCase(value)){
pageContext.getOut().print("<spanclass='labellabel-warning'>"+value+"</span>");
}else{
pageContext.getOut().print("<spanclass='labellabel-important'>"+value+"</span>");
}
}catch(Exceptione){
e.printStackTrace();
}
returnEVAL_PAGE;
}
效果:
