Вопрос

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

<html>
  <head>
  [snip]
  <meta name="generator" value="thevalue i'm looking for" />
  [snip]
Это было полезно?

Решение

Зависит от того, насколько сложный 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));
}

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

Другие советы

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

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

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

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

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

Хороший учебник: Синтаксический анализ XML-документа с помощью XPath

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

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

Это зависит от обстоятельств.

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

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

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

  1. Откройте java.net.HttpURLConnection
  2. Получите входной поток, используя getInputStream
  3. Используйте регулярное выражение в ответе Майка, чтобы разобрать нужный вам фрагмент
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top