Java: ich habe eine große html-string und müssen extrahieren href="..." text
Habe ich in diesem string, der einen großen Teil der html-und bin versucht, extrahieren Sie den link aus dem href="..." - Teil der Zeichenfolge. Href könnte in einer der folgenden Formen:
<a href="..." />
<a class="..." href="..." />
Ich habe nicht wirklich ein problem mit regex, aber für einige Grund, wenn ich den folgenden code verwenden:
String innerHTML = getHTML();
Pattern p = Pattern.compile("href=\"(.*)\"", Pattern.DOTALL);
Matcher m = p.matcher(innerHTML);
if (m.find()) {
//Get all groups for this match
for (int i=0; i<=m.groupCount(); i++) {
String groupStr = m.group(i);
System.out.println(groupStr);
}
}
Kann mir jemand sagen, was falsch ist mit meinem code? Ich habe dieses Zeug in php, sondern in Java bin ich irgendwie etwas falsch... Was passiert ist, dass es druckt den gesamten html-string, Wann immer ich versuche, es zu drucken...
EDIT: Nur, damit jeder weiß, welche Art von string ich beschäftige mich mit:
<a class="Wrap" href="item.php?id=43241"><input type="button">
<span class="chevron"></span>
</a>
<div class="menu"></div>
Jedesmal, wenn ich den code ausführen, druckt es die ganze Zeichenfolge... das ist das problem...
Und über die Verwendung von jTidy... ich bin auf es, aber es wäre interessant zu wissen, was falsch gelaufen ist in diesem Fall auch...
Oops... Sorry... Aktualisiert die post. Aber das problem war, dass es nicht geben Sie mir die links, aber eher drucken die ganze Schnur wieder...
"Kann mir jemand sagen, was falsch ist mit meinem code?" - ja, Sie sind, versucht die RegEx für etwas, das es nicht verwendet werden sollte. Verwenden Sie einen HTML-DOM-parser, wie jTidy (link in BalusC Antwort unten).
Einige Leute, wenn Sie mit einem problem konfrontiert, denken, "ich weiß, ich werde Sie reguläre Ausdrücke verwenden." Nun haben Sie zwei Probleme.
InformationsquelleAutor Legend | 2009-11-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eine gierige Betrieb nehmen, dass alle Zeichen einschließlich der Anführungszeichen.
Probieren Sie etwas wie:
Wahrscheinlich, weil er verpasste den Quantifizierer nach dem negierten zitieren. Aber wie auch immer, aufhören zu versuchen, zu verwenden, RegEx für diese, es ist das falsche Werkzeug für den job!
Aber es ist das Schnellste Werkzeug für den job (Entwicklung-wise). Html-Parser kann ein Schmerz sein.
Regex nicht match-HTML-Knoten richtig. Auch mit dem nicht-Regelmäßigen Erweiterungen in vielen modernen regex-Erweiterungen, HTML ist zu Komplex.
Xpath arbeitet auf html zu? @Peter ich verstehe das, aber die Arbeit hier war nicht zu entsprechen, html-Knoten, aber finden einfach die links.
InformationsquelleAutor Kugel
Regex ist toll, aber nicht das richtige Werkzeug für diesen bestimmten Zweck. Normalerweise Sie verwenden möchten stackbased parser für diese. Haben Sie einen Blick auf Java-HTML-parser-API ' s wie jTidy.
InformationsquelleAutor BalusC
Gibt es zwei Probleme mit dem code, den du gepostet hast:
Erstens die
.*
in Ihrem regulären Ausdruck ist gierig. Dadurch wird es entsprechend alle Zeichen bis zum letzten"
Zeichen, die gefunden werden können. Sie können dieses Spiel nicht gierig, indem Sie diese zu.*?
.Zweitens, um abholen alle Spiele, die Sie müssen halten Sie die Iteration mit
Matcher.find
eher als die Suche nach Gruppen. Gruppen geben Ihnen Zugriff auf die jeweils in Klammern gesetzten Abschnitt des regex. Sie aber suchen jedes mal die ganzen regulären Ausdruck entspricht.Setzt man diese zusammen, können Sie den folgenden code, die sollten tun, was Sie brauchen:
InformationsquelleAutor Phil Ross
Verwenden Sie eine integrierte parser. So etwas wie:
Oder verwenden Sie den ParserCallback:
Den Leser könnte ein StringReader.
InformationsquelleAutor camickr
Einen anderen einfachen und verlässlichen Weg, es zu tun ist durch die Verwendung Jsoup
InformationsquelleAutor surajz
können Sie einen html-parser-Bibliothek. jtidy zum Beispiel gibt Sie ein DOM-Modell der html -, aus denen Sie extrahiert werden können, alle "a" Elemente und Lesen Sie deren "href" - Attribut
InformationsquelleAutor Lorenzo Boccaccia
"href=\"(.*?)\""
sollte auch funktionieren, aber ich denke, dass Kugel die Antwort wird schneller arbeiten.InformationsquelleAutor Denis Tulskiy