2017-01-19 3 views
1

Ich versuche, einen Skript-Tag auf Seite mit Text zu markieren enthältJsoup nicht auswählen Script Tag

Document doc=jsoup.parse(somehtml); 
Elements ele=doc.select("script:contains(accountIndex)"); 

-Code für Script-Tag auf der Seite ist

<script>(function() {var vm = ko.mapping.fromJS({ 
"accountIndex": 1, 
"accountNumber": "*******", 
"hideMoreDetailsText": "Hide More Details", 
"viewAccountNumberText": "Show Account Number", 
"hideAccountNumberText": "Hide Account Number", 
});window.AccountDetails = vm;})();</script> 

Ich bin in der Lage, dies zu wählen script-Tag, wenn ich übergebe CSS-Locator von Script-Tag wie

Elements ele=doc.select("body > script:nth-child(44)"); 

Es gibt viele Script-Tag auf der Seite, so dass der zweiten Ansatz ist nicht generisch. Es kann sich in Zukunft ändern.

Kann bitte jemand sagen, was das Problem mit dem ersten approach.Because ist ich in der Lage bin andere Tags auf der Seite auszuwählen, die mit enthält von jsoup

Antwort

2

Der Wähler :contains(text) für ein Element sieht, dass das Text Wert hat. Ein Skript hat keinen Text, es hat Daten (ansonsten wäre das JS im Browser sichtbar). Sie können stattdessen den Selektor :containsData(data) verwenden.

Z. B .:

Elements els = doc.select("script:containsData(accountIndex)"); 

Hier ist ein example. Die Selector documentation hat alle abgefragten Abfragetypen (was nicht nur striktes CSS ist).

+0

Es funktioniert! Danke vielmals! Ein Skript hat keinen Text, es hat Daten, es hat wirklich eine klare Erklärung, warum das nicht funktioniert hat. – Ravi

+0

1 weitere Frage viele versteckte Tags werden auch von jsoup analysiert. Obwohl sie nicht im Browser angezeigt werden, behandelt jsoup ihren Inhalt als Text und behandelt Skript-Inhalt nicht als Text. – Ravi

+0

Wie zum Beispiel? –

1

jsoup unterstützt nur CSS-Selektoren, und solche, die nur erlauben Sie, basierend auf wählen auf CSS-Klassen und -Eigenschaften der DOM-Elemente, nicht deren Textinhalt (CSS selector based on element text?). Sie könnten versuchen, einen anderen Rahmen für die Analyse und Abfrage des HTML, zum Beispiel XOM und tagsoup wie hier beschrieben: https://stackoverflow.com/a/11817487/7433999

Oder könnten Sie CSS-Klassen zu youc Script-Tags wie folgt hinzufügen:

<script class="class1"> 
// script1 
</script> 
<script class="class2"> 
// script2 
</script> 

Dann können Sie wählen Sie die Script-Tags erneut über CSS jsoup:

Elements elements = document.select("script.class1"); 
+0

Jsoup erlaubt Auswahl basierend auf Text enthält, wie ich andere Elemente über select auswählen kann. – Ravi