Frage

Was ist der einfachste Weg, mithilfe regulärer Ausdrücke den HTML-Code einer Website abzurufen und den Wert in diesem Tag (oder den Wert eines beliebigen Attributs) zu finden?

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

Lösung

Hängt davon ab, wie komplex die HTTP-Anfrage ist, die Sie erstellen müssen (Authentifizierung usw.).Hier ist eine einfache Möglichkeit, die ich in der Vergangenheit gesehen habe.

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));
}

Beim Kompilieren sind hier wahrscheinlich viele Tippfehler zu finden.(Ich hoffe, das waren keine Hausaufgaben)

Andere Tipps

Es ist erstaunlich, dass niemand oft mit dem Problem von HTML konfrontiert wird, wenn er sich mit dem Problem der Verwendung von RegEx mit HTML befasst NICHT wohlgeformt sein, wodurch viele HTML-Parser völlig unbrauchbar werden.

Wenn Sie Tools zum Analysieren von Webseiten entwickeln und es sich tatsächlich um kein wohlgeformtes HTML handelt, ist die Aussage „Regex sollte niemals zum Parsen von HTML verwendet werden“ oder „Verwenden Sie einen HTML-Parser“ einfach völlig falsch.Tatsache ist, dass Menschen in der realen Welt HTML nach Lust und Laune erstellen – und nicht unbedingt für Parser geeignet sind.

RegEx Ist eine völlig gültige Möglichkeit, Elemente in Text, also in HTML, zu finden.Wenn es eine andere vernünftige Möglichkeit gibt, die Probleme des Originalposters anzugehen, dann posten Sie sie, anstatt auf eine „Verwenden Sie einen Parser“- oder „RTFM“-Anweisung zu verweisen.

Sie sollten eine XPath-Abfrage verwenden.

Es ist so einfach wie den Wert zu ermitteln /html/head/meta[@name=generator]/@value.

Ein gutes Tutorial: Parsen eines XML-Dokuments mit XPath

Möglicherweise möchten Sie die Dokumentation des Apache-Pakets org.apache.commons.HttpClient und der zugehörigen Pakete überprüfen Hier.Das Senden einer HTTP-Anfrage von einer Java-Anwendung aus ist ziemlich einfach.Das Durchblättern der Dokumentation sollte Sie auf den richtigen Weg bringen.

Streng genommen können Sie nicht wirklich sicher sein, dass Sie den richtigen Wert erhalten haben, da das Meta-Tag möglicherweise auskommentiert ist oder das Meta-Tag möglicherweise in Großbuchstaben geschrieben ist usw.Es hängt davon ab, wie sicher Sie sind, dass der HTML-Code als „schön“ angesehen werden kann.

Es kommt darauf an.

Wenn Sie Informationen von einer Site oder von Sites extrahieren, bei denen es sich garantiert um wohlgeformtes HTML handelt, und Sie wissen, dass das <meta> nicht in irgendeiner Weise verschleiert wird, lesen Sie den Abschnitt <head> Zeile für Zeile und wenden Sie a an Regex ist ein guter Ansatz.

Wenn andererseits der HTML-Code möglicherweise entstellt oder „knifflig“ ist, müssen Sie einen geeigneten HTML-Parser verwenden, möglicherweise einen freizügigen wie HTMLTidy.Hüten Sie sich vor der Verwendung eines strikten HTML- oder XML-Parsers für Inhalte, die von zufälligen Websites stammen.Viele sogenannte HTML-Codes, die Sie dort finden, sind tatsächlich fehlerhaft.

Ich habe das nicht ausprobiert, wäre aber nicht das Grundgerüst

  1. Öffne ein java.net.HttpURLConnection
  2. Holen Sie sich einen Eingabestream mit getInputStream
  3. Verwenden Sie den regulären Ausdruck in Mikes Antwort, um den gewünschten Teil zu analysieren
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top