使用Java进行网页数据抓取

时间:2010-04-11 01:37:49

标签: java html

我现在正在尝试使用Java实现一个简单的HTML网页抓取工具。现在我遇到了一个小问题。 假设我有以下HTML片段。

<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, 

我感兴趣的数据是底部显示的整数1.439。我只是想知道如何从HTML中获取该整数。 我现在正在考虑使用正则表达式,然后使用java.util.Pattern来帮助获取数据,但仍然不太清楚该过程。 如果你们能给我一些关于这个数据抓取的提示或想法,我将不胜感激。 非常感谢。

3 个答案:

答案 0 :(得分: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是一个与“Showing ...”行匹配的正则表达式模式。 m是将该模式应用于已删除的HTML的结果。如果m.matches()为真,则表示模式与HTML匹配,m.group(1)将是模式中的第一个正则表达式组(括号中的表达式),它是([0-9,]+),与字符串匹配数字和逗号,所以它将是“1,459”。 replaceAll()调用将其转换为“1459”,Integer.parseInt()将其转换为整数1459

答案 1 :(得分:1)

使用正则表达式来解析文本是一种可能性。有时,您需要的特定文本位于DOM层次结构中的特定div中,因此您可以使用xpath表达式来查找所需内容。有时您想要查找特定类的div。这取决于具体的HTML。除了正则表达式之外,一个好的HTML解析器也会派上用场。我使用了Jericho HTML,但还有很多其他的。

答案 2 :(得分:1)

使用HTML解析器获取该部分,然后使用正则表达式删除部分,直到“of”和部分来自“匹配”并打开。这是SSCCE HtmlUnit的帮助:

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