Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
基于Java的网页数据抓取_Java_Html - Fatal编程技术网

基于Java的网页数据抓取

基于Java的网页数据抓取,java,html,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-0942

我现在正试图用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, 

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

正则表达式可能是最好的方法。比如:

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()
为true,则表示模式与HTML匹配,
m.group(1)
将是模式中的第一个正则表达式组(括号中的表达式),即
([0-9,]+)
,它匹配一组数字和逗号,因此它将是“1459”。调用
replaceAll()
将其转换为“1459”,而
Integer.parseInt()
将其转换为整数1459

正则表达式可能是最好的方法。比如:

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()
为true,则表示模式与HTML匹配,
m.group(1)
将是模式中的第一个正则表达式组(括号中的表达式),即
([0-9,]+)
,它匹配一组数字和逗号,因此它将是“1459”。调用
replaceAll()
将其转换为“1459”,而
Integer.parseInt()
将其转换为整数1459

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

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

使用HTML解析器获取该片段,然后使用正则表达式删除该部分,直到使用“of”和“matches”等等。以下是一个有助于:


使用HTML解析器获取该片段,然后使用正则表达式删除该部分,直到使用“of”和“matches”等等。以下是一个有助于:

HtmlElement results = page.getElementById("sr-num-results"); // <div id="sr-num-results">
String total = text.replaceAll("^(.*of)|(matches.*)$", "").trim(); // 1,439