Быстрый способ найти значение в HTML (Java) - PullRequest
0 голосов
/ 28 августа 2008

Используя регулярные выражения, как проще всего получить HTML-код веб-сайта и найти значение внутри этого тега (или значение любого атрибута в этом отношении):

<html>
  <head>
  [snip]
  <meta name="generator" value="thevalue i'm looking for" />
  [snip]

Ответы [ 7 ]

9 голосов
/ 28 августа 2008

Зависит от того, насколько сложным является запрос Http, который вам нужно создать (аутентификация и т. Д.). Вот один простой способ, который я видел в прошлом.

StringBuilder html = new StringBuilder();
java.net.URL url = new URL("http://www.google.com/");
BufferedReader input = null;
try {
    input new BufferedReader(
        new InputStreamReader(url.openStream()));

    String htmlLine;
    while ((htmlLine=input.readLine())!=null) {
        html.appendLine(htmlLine);
    }
}
finally {
    input.close();
}

Pattern exp = Pattern.compile(
    "<meta name=\"generator\" value=\"([^\"]*)\" />");
Matcher matcher = exp.matcher(html.toString());
if(matcher.find())
{
    System.out.println("Generator: "+matcher.group(1));
}

Вероятно, здесь много опечаток, которые можно найти при компиляции. (надеюсь, это не домашняя работа)

4 голосов
/ 17 декабря 2010

Удивительно, как никто, когда решает проблему использования RegEx с HTML, часто сталкивается с проблемой HTML НЕ правильной формы, что делает многие HTML-парсеры совершенно бесполезными.

Если вы разрабатываете инструменты для анализа веб-страниц и тот факт, что они не являются правильно сформированным HTML, утверждение «Regex никогда не следует использовать для разбора HTML« og »используйте анализатор HTML», является просто фальшивым. Факты таковы, что в реальном мире люди создают HTML по своему усмотрению - и не обязательно подходят для анализаторов.

RegEx является полностью допустимым способом поиска элементов в тексте, то есть в HTML. Если есть какой-либо другой разумный способ противостоять проблемам, с которыми сталкивается оригинальный постер, разместите их, вместо того чтобы ссылаться на выражение «использовать анализатор» или «RTFM».

1 голос
/ 26 сентября 2008

Вы должны использовать XPath-запрос.

Это так же просто, как получить значение /html/head/meta[@name=generator]/@value.

Хороший учебник: Разбор XML-документа с XPath

0 голосов
/ 22 ноября 2009

Это зависит.

Если вы извлекаете информацию с сайта или сайтов, которые гарантированно являются правильно сформированным HTML, и вы знаете, что не будет каким-то образом запутан, тогда читайте раздел построчно и применение регулярных выражений является хорошим подходом.

С другой стороны, если HTML может быть искаженным или «хитрым», то вам нужно использовать правильный анализатор HTML, возможно, разрешающий, такой как HTMLTidy. Остерегайтесь использования строгого парсера HTML или XML на материалах, перебираемых со случайных веб-сайтов. Вы обнаружите, что многие из так называемых HTML на самом деле искажены.

0 голосов
/ 19 сентября 2008

Строго говоря, вы не можете быть уверены, что получили правильное значение, поскольку метатег может быть закомментирован, или метатег может быть в верхнем регистре и т. Д. Это зависит от того, насколько вы уверены, что HTML может рассматриваться как "красиво".

0 голосов
/ 28 августа 2008

Я не пробовал этого, но базовый фреймворк не будет

  1. Открыть java.net.HttpURLConnection
  2. Получить входной поток, используя getInputStream
  3. Используйте регулярное выражение в ответе Майка, чтобы разобрать нужный бит
0 голосов
/ 28 августа 2008

Вы можете проверить документацию для пакета Apache org.apache.commons.HttpClient и связанных пакетов здесь . Отправка HTTP-запроса из Java-приложения довольно проста. Просмотр документации должен направить вас в правильном направлении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...