2010-04-11 3 views
1

Теперь я пытаюсь реализовать простой скребок веб-страницы HTML с помощью Java. Теперь у меня небольшая проблема. Предположим, у меня есть следующий фрагмент 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, 

Данные Меня интересует является целым числом 1,439 показано на bottom.I я просто интересно, как я могу получить, что целое число из HTML. Теперь я рассматриваю возможность использования регулярного выражения, а затем использовать 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

Использование регулярного выражения для синтаксического анализа текста - одна из возможностей. Иногда также нужен конкретный текст в конкретном div в DOM hiearchy, поэтому вы можете использовать выражение xpath, чтобы найти то, что вам нужно. Иногда вы хотите искать divs определенного класса. Это зависит от конкретного HTML. Помимо регулярных выражений, хороший парсер HTML будет полезен. Я использовал Jericho HTML, но есть много других.

1

Используйте парсер HTML, чтобы получить эту часть, а затем используйте регулярное выражение, чтобы избавиться от части до тех пор, пока она не будет «из», а часть из «совпадений» и далее. Вот 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 
Смежные вопросы