Быстрый способ найти значение в HTML (Java)
Вопрос
Используя регулярные выражения, каков самый простой способ получить 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-файлы, которые вы обнаруживаете там, на самом деле искажены.
Я не пробовал этого, но разве базовым фреймворком не было бы
- Откройте
java.net.HttpURLConnection
- Получите входной поток, используя
getInputStream
- Используйте регулярное выражение в ответе Майка, чтобы разобрать нужный вам фрагмент