❶ 誰教我用java遍歷網頁裡面的所有超鏈接,把這些超鏈接鏈接到得網頁下載下來。
有一個開源的褲:htmlparser足夠你用的了!
1、 簡介
htmlparser是一個純的java寫的html解析的庫,它不依賴於其它的java庫文件,主要用於改造或提取html。它提供了介面,支持線性和嵌套HTML文本。在實際的項目中只需要將htmlparser.jar 導入classpath中,就可以使用HTMLParser提供的API了。
2、 主要應用
HTML Parser項目主要可以用在以下兩個方面:
1. 信息提取
· 文本信息抽取,例如對HTML進行有效信息搜索
· 鏈接提取,用於自動給頁面的鏈接文本加上鏈接的標簽
· 資源提取,例如對一些圖片、聲音的資源的處理
· 鏈接檢查,用於檢查HTML中的鏈接是否有效
· 頁面內容的監控
2. 信息轉換
· 鏈接重寫,用於修改頁面中的所有超鏈接
· 網頁內容拷貝,用於將網頁內容保存到本地
· 內容檢驗,可以用來過濾網頁上一些令人不愉快的字詞
· HTML信息清洗,把本來亂七八糟的HTML信息格式化
· 轉成XML格式數據
3、 數據組織分析
HTML有3種類型的節點:RemarkNode:html中的注釋,TagNode:標簽節點,TextNode:文本節點。HTMLParser將讀雹鄭取的二進制數據流,進行編碼轉換、詞法分析等操作,生成樹形層次結構的Node節點集合。
HtmlParser主要靠Node和Tag來表達Html。
Node是形成樹結構表示HTML的基礎,所有的數據表示都是介面Node的實現,Node定義了與頁面樹結構所表達的頁面Page對象,定義了獲取父、子、兄弟節點的方法,定義了節點到對應html文本的方法,定義了該節點對應的起止位置,定義了過濾方法 ,定義了Visitor訪問機制。AbstractNode是Node的一種具體的類實現,起到構成樹形結構的作用,除了同具體Node相關的accetp方法,toString,toHtml,toPlainTextString方法以外,AbstractNode實現了大多基本的方 法,使得它的子類,不用理會具體的樹操作。
Node分成三類:
§ RemarkNode:代表Html中的注釋
§ TagNode:標簽節點,是種類最多的節點類型,上述Tag的具體節點類都是TagNode的實現。
§ TextNode:文本節點
Tag是具體分析的主要內容。Tag分成composite的Tag和不能包含其他Tag的簡單Tag兩類,其中前者的基類是CompositeTag,其子類包含BodyTag,Div,FrameSetTag,OptionTag,等27個子類 ;而簡單Tag有BaseHrefTag、DoctypeTag,FrameTag,ImageTag,InputTag,jspTag,MetaTag,ProcessingInstructionTag這八類。
4、Visitor方式訪問Html:
(1)、整體解析過程
§ 用一個URL或頁面String做一個Parser
§ 用這個Parser做一個Visitor
§ 使用Parser.visitAllNodeWith(Visitor)來遍歷節點
§ 獲取Visitor遍歷後得到的數據
(2)、系統Visitor功能簡介:
§ ObjectFindingVisitor:用來找出所有指定類型的節點,採用getTags()來獲取結果。
§ StringBean:用來從一個指定的URL獲取移除了<SCRIPT></SCRIPT>和<PRE></PRE>之間代碼的Html代碼,也可以用做Visitor,用來移除這兩種標簽內部的代碼,採用StringBean.getStrings()來獲取結果。
§ HtmlPage:提粗肆蠢取Title,body中的節點和頁面中的TableTag節點。
§ LinkFindingVisitor:找出節點中包含某個鏈接的總個數。
§ StringFindingVisitor:找出遍歷的TextNode中含有指定字元串的個數。
§ TagFindingVisitor:找出指定Tag的所有節點,可以指定多種類型。
§ TextExtractingVisitor:從網頁中把所有標簽去掉來岩陪提取文本,這個提取文本的Visitor有時是很實用的 ,只是注意在提取文本時將標簽的屬性也去掉了,也就是說只剩下標簽之間的文本,例如<a>中的鏈接也去掉了。
§ UrlModifyingVisitor:用來修改網頁中的鏈接。
(3)、Filter
如果說visitor是遍歷提取信息,當然這個信息可以包括某些節點或者從節點分析出來的更有效的信息,這都取決於我們的Visitor做成什麼樣子,那麼Filter則目標很明確,就是用來提取節點的。
系統定義了17種具體的Filter,包括依據節點父子關系的Filter,連接Filter組合的Filter,依據網頁內容匹配情況的filter,等等。我們也可以implement Filter來做自己的Filter來提取節點。
Filter的調用是同Visitor獨立的,因為也無需先filter出一些NodeList,再用Visitor來訪問。調用Filter的方法是:
NodeList nodeList = myParser.parse(someFilter);
解析之後,我們可以採用:
Node[] nodes = nodeList.toNodeArray();
來獲取節點數組,也可以直接訪問:
Node node = nodeList.elementAt(i)來獲取Node。
另外,在Filter後得到NodeList以後,我們仍然可以使用NodeList的extractAllNodesThatMatch (someFilter)來進一步過濾,同時又可以用NodeList的isitAllNodesWith(someVisitor)來做進一步的訪問。
這樣,我們可以看到HtmlParser為我們提供了非常方便的Html解析方式,針對不同的應用可以採用visitor來遍歷Html節點提取數據,也可以用Filter來過濾節點,提取出我們所關注的節點,再對節點進行處理。通過這樣的組合,一定能夠找出我們所需要的信息。
5、亂碼問題
對於HTMLParser 工具包我們需要修改其中的htmlparser.java文件使其適用中文的html文件分析。htmlparser.java文件中具體實現細節就不再介紹。這里主要是把protected static final String DEFAULT_CHARSET = "ISO-8859-1";修改成protected static final String DEFAULT_CHARSET = "gb2312";因為採用默認的字元集"ISO-8859-1"對含有中文的html文件進行分析的時候就會出現亂碼。必須進行new String(str.getBytes("ISO-8859-1"),"GB2312")的轉換工作。對於修改好的htmlparser工具包,需要重新壓縮成.jar文件,放到jdk的工作環境中。
6、自定義標簽:
注意這個類PrototyicalNodeFactory,首先創建一個它的實例,然後注冊你說自定義的Tag,再將這個工廠放置到你的parser中:
factory.registerTag(new IFrameTag());
parser.setNodeFactory(factory);
然後你再試試看,保證能夠解析到你想要得那些標准htmlparser不支持的tag。
❷ Java 如何遍歷數組裡面的數據
二維數組好升定義:數據類明襪純型[][] 數組名 = new 數據類型[二維數組行數][二維數組列數]
如:int[] array = new int[5][4];
二維數組的遍歷:需要使用兩個變數來分別遍歷行和列,具體遍歷方法就很多啦,可以使用while語句激咐、do-while語句、for語句,也可以相互結合使用。
如:
inti=0,j=0;
for(inti=0;i<array.length;i++){
for(intj=0;j<array[i].length;j++){
System.out.println(array[i][j]+"、");
}
System.out.println("");
}
❸ Java如何給LinkedList賦值並遍歷
publicclasstest{
publicstaticvoidmain(String[]args){
LinkedList<Integer[][]>page=newLinkedList<Integer[][]>();
Integer[][]matrix1={{5,6,7},{8,9,10}};
Integer[][]matrix2={{1,2,3,5},{4,5,6,20},{9,2,1,19}};
page.add(matrix1);
page.add(matrix2);
for(Integer[][]x:page){//遍歷page中的數組
//遍歷page中的多維數組
for(inti=0;i<x.length;i++){//多維數組中x.length是行數
System.out.print("{");
for(intj=0;j<x[i].length;j++){//x[0]~x[n]的length是列數
System.out.print(x[i][j]);//輸出i行j列
System.out.print(",");
}
System.out.println("}");
}
}
}
}
賦值用add,遍歷用多重循環,遍歷輸出結果如下
❹ 如何用Java遍歷一個網路目錄下的所有文件
java中可以通過遞歸的方式獲取指定路徑下的所有文件並將其放入List集合中。 假設指定路徑為path,目標集合為fileList,遍歷指定路徑下的所有文件,如果是目錄文件則遞歸調用
❺ java中map的常用遍歷方法有哪些
ava中map的常用遍歷的具體方法有:
一 、在for-each循環中使用entries來遍歷。這是最御蔽常見的並且在大多數情況下也是最鎮睜州可取的遍歷方式。在鍵值都需要時使用。
二、 在for-each循環中遍歷keys或values。如果只需要map中的鍵或者值,你可以通過keySet或values來實現遍歷,而不是用entrySet。
三、使用Iterator遍歷。
四、通過鍵找值遍歷(效率低)。
總結:如果僅需要鍵(keys)或值(values)使用方法二。如果你使用的語言版本低於java 5,或是打算在遍歷時刪除entries,必須使用方法三。否則使用方法一(鍵值都要早伍)。
❻ 在java中,遍歷是幹嘛用的有什麼意義
你說的比較籠統,遍歷的話,可以遍歷數組,遍歷list,遍歷鏈表,遍歷圖,樹等等,遍歷的意義就在於檢查集鎮斗鋒合中的元素並做處理。至於什麼順序,那要根據需求嘍。
例子,比較簡單的是,遍歷一個整型銷纖數組,找出裡面最大的數御晌。
❼ java Map 怎麼遍歷
關於java中遍歷map具體有四種方式,請看下文詳解。
1、這是最常見的並且在大多數情況下也是最可取的遍歷方式,在鍵值都需要時使用。
Map<Integer, Integer> map = newHashMap<Integer, Integer>();
for(Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println("Key = "+ entry.getKey() + ", Value = "+ entry.getValue());
}
2、在for-each循環中遍歷keys或values。
如果只需要map中的鍵或者值,你可以通過keySet或values來實現遍歷,而不是用entrySet。
Map<Integer, Integer> map = newHashMap<Integer, Integer>();
for(Integer key : map.keySet()) {
System.out.println("Key = "+ key);
}
for(Integer value : map.values()) {
System.out.println("Value = "+ value);
}
該方法比entrySet遍歷在性能上稍好(快了10%),而且代碼更加干凈。
3、使用Iterator遍歷
使用泛型:
Map<Integer, Integer> map = newHashMap<Integer, Integer>();
Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator();
while(entries.hasNext()) {
Map.Entry<Integer, Integer> entry = entries.next();
System.out.println("Key = "+ entry.getKey() + ", Value = "+ entry.getValue());
}
不使用泛型:
Map map = newHashMap();
Iterator entries = map.entrySet().iterator();
while(entries.hasNext()) {
Map.Entry entry = (Map.Entry) entries.next();
Integer key = (Integer)entry.getKey();
Integer value = (Integer)entry.getValue();
System.out.println("Key = "+ key + ", Value = "+ value);
}
4、通過鍵找值遍歷(效率低)
Map<Integer, Integer> map = newHashMap<Integer, Integer>();
for(Integer key : map.keySet()) {
Integer value = map.get(key);
System.out.println("Key = "+ key + ", Value = "+ value);
}
假設Map中的鍵值對為1=>11,2=>22,3=>33,現用方法1來遍歷Map代碼和調試結果如下:
(7)javapage遍歷擴展閱讀:
1、HashMap的重要參數
HashMap 的實例有兩個參數影響其性能:初始容量 和載入因子。容量是哈希表中桶的數量,初始容量只是哈希表在創建時的容量。
載入因子 是哈希表在其容量自動增加之前可以達到多滿的一種尺度。當哈希表中的條目數超出了載入因子與當前容量的乘積時,則要對該哈希表進行 rehash 操作(即重建內部數據結構),從而哈希表將具有大約兩倍的桶數。
在Java編程語言中,載入因子默認值為0.75,默認哈希表元為101。
2、HashMap的同步機制
注意,此實現不是同步的。 如果多個線程同時訪問一個哈希映射,而其中至少一個線程從結構上修改了該映射,則它必須保持外部同步。
(結構上的修改是指添加或刪除一個或多個映射關系的任何操作;以防止對映射進行意外的非同步訪問,如下:
Map m = Collections.synchronizedMap(new HashMap(...));
❽ java pager 怎麼遍歷
首先,自然是下載組件,並將pager-taglib.jar放入/web-inf/lib目錄下。游豎顫
其次,引入標簽庫。
[java] view plain
<%@taglib uri="http://jsptags.com/tags/navigation/pager" prefix="pg" %>
再者,書寫標簽體。
[html] view plain
<table cellpadding="0" cellspacing="0">
<tr>
<th>ID</th>
<th>用戶名</th>
<th>角色</th>
<th>姓名</th>
<th>性別</th>纖李
<th>年齡</th>
<th>電子郵箱</th>
<th>聯系電話</th>
<th>狀態</th>
</tr>
<c:forEach items="${requestScope.users}" var="item">
<tr>
<td>${item.userID}</td>
<td>${item.userName }</td>
<td>${item.roleName }</td>
<td>${item.name }</td>
<td>${item.gender }</td>
<td>${item.age }</td>
<td>${item.email }</td>
<td>${item.telephone }</td>
<td>${(item.state=="0")?"不在線":"在線" }</td>
</tr>
</c:forEach>
</table>
<!--
url:指點擊頁數後,程序將執行的方法。
items:指記錄總數,該組件根本這個數計算出要分多少頁。
maxPageItems:每頁最多顯示多少條數據。
maxIndexPages:最多顯示多少頁。例如:10,則首頁12345678910下一頁尾頁
export:需要暴露的變數。一般默認即可。
<pg:param name="xxx">這神敗個標簽可以增加需要傳入後台的參數
<pg:first>像first prev這些標簽,和字面意思相同,即表示第一頁前一頁。
另,下面有一些常用的pager屬性:
pageUrl:分頁的鏈接,後面自動帶有參數。
pageNumber:頁號。
pager.offset:pageUrl後面帶的參數,表示該頁的第一個元素的索引。對資料庫分頁有用。
-->
<pg:pager url="/clinic/usermanage" items="${requestScope.total}" maxPageItems="10" maxIndexPages="10">
<pg:index>
<pg:first><a href="${pageUrl}">首頁</a></pg:first>
<pg:prev><a href="${pageUrl}">上一頁</a></pg:prev>
<pg:pages><a href="${pageUrl}">${pageNumber}</a></pg:pages>
<pg:next><a href="${pageUrl}">下一頁</a></pg:next>
<pg:last><a href="${pageUrl}">尾頁</a></pg:last>
</pg:index>
</pg:pager>
❾ java中怎麼解決數據遍歷
遍歷就是將一個集合裡面的元素一個一個的訪問。
遍歷是為鏈前了對棚敏清集合裡面的元素進行操作,訪問一個元素你就可拿掘以對這個元素進行一定的操作,比如說修改,列印等等
這個集合可以是數組、隊列、表、樹等
❿ java自動化測試怎麼遍歷頁面中的表格
要看你用的是什麼自動化工具了,我常用的是jsoup,htmlunit,selenium,這些工具都能遍歷表格,通過jsoup元素選擇器可以得到Elements對象,遍歷它就可以。後面兩個通過xpath選擇器可以返回一個集合,遍歷這個集合也可以