2010-04-11 137 views
1

我正在嘗試使用Java.Now實現一個簡單的HTML網頁抓取工具,現在我遇到了一個小問題。 假設我有以下HTML片段。使用Java抓取網頁數據

<div id="sr-h-left" class="sr-comp"> 
    <a class="link-gray-underline" id="compare_header" rel="nofollow" href="javascript:i18nCompareProd('/serv/main/buyer/ProductCompare.jsp?nxtg=41980a1c051f-0942A6ADCF43B802');"> 
     <span style="cursor: pointer;" class="sr-h-o">Compare</span> 
    </a> 
</div> 
<div id="sr-h-right" class="sr-summary"> 
    <div id="sr-num-results"> 
     <div class="sr-h-o-r">Showing 1 - 30 of 1,439 matches, 

我感興趣的數據是在bottom.I表示只是想知道我怎麼可以得到整出HTML的整數1.439。 我現在正在考慮使用一個正則表達式,然後使用java.util.Pattern來幫助獲取數據,但仍然不清楚這個過程。 如果你們可以給我一些關於這個數據刮擦的暗示或想法,我將不勝感激。 非常感謝。

回答

2

正則表達式可能是最好的方法。喜歡的東西:

Pattern p = Pattern.compile("Showing [0-9,]+ - [0-9,]+ of ([0-9,]+) matches"); 
Matcher m = p.matches(scrapedHTML); 
if(m.matches()) { 
    int num = Integer.parseInt(m.group(1).replaceAll(",", "")); 
    // num == 1439 
} 

我不知道你瞭解了「過程」的意思,但這裏的代碼做什麼:p是匹配的「顯示...」行正則表達式模式。 m是將該模式應用於抓取的HTML的結果。如果m.matches()爲真,則表示該模式與HTML匹配,並且m.group(1)將成爲該模式中第一個正則表達式組(表達式,括號中的表達式),它是([0-9,]+),它匹配一串數字和逗號,因此它將是「1,459 」。 replaceAll()調用將其轉換爲「1459」,並且Integer.parseInt()將其轉換爲整數1459

1

使用正則表達式解析文本是一種可能性。有時候,您需要的特定文本位於DOM hiearchy的特定div中,因此您可以使用xpath表達式來查找所需內容。有時候你想找一個特定類的div。它取決於具體的HTML。除了正則表達式,一個好的HTML解析器將派上用場。我已經使用Jericho HTML,但還有其他許多人。

1

使用HTML解析器來獲取該部分,然後使用正則表達式來清除該部分,直到使用「of」和來自「matches」的部分。下面是與HtmlUnit幫助的SSCCE

package com.stackoverflow.q2615727; 

import java.text.NumberFormat; 
import java.util.Locale; 

import com.gargoylesoftware.htmlunit.WebClient; 
import com.gargoylesoftware.htmlunit.html.HtmlElement; 
import com.gargoylesoftware.htmlunit.html.HtmlPage; 

public class Test { 

    public static void main(String... args) throws Exception { 
     WebClient client = new WebClient(); 
     HtmlPage page = client.getPage("http://www.google.com/search?q=html+parser"); 
     HtmlElement results = page.getElementById("resultStats"); // <div id="resultStats"> 
     String text = results.asText(); // Results 1 - 10 of about 2,050,000 for html parser. (0.18 seconds) 
     String total = text.replaceAll("^(.*about)|(for.*)$", "").trim(); // 2,050,000 
     Long l = (Long) NumberFormat.getInstance(Locale.ENGLISH).parse(total); // 2050000 
     System.out.println(l); 
    } 

} 

在特定情況下,你可能希望只更換URL,並在以下兩行:

HtmlElement results = page.getElementById("sr-num-results"); // <div id="sr-num-results"> 

String total = text.replaceAll("^(.*of)|(matches.*)$", "").trim(); // 1,439