2016-03-31 11 views
1

Ich verwende die Crawler-Bibliothek, mit der Sie einige XPath-Ausdrücke erstellen können, um den Inhalt der HTML-Tags abzurufen. Ich lese gerade einen HTML5-Inhalt von einer Seite und möchte auf diese Weise einen Text abrufen, der nicht in ein Tag eingefügt wurde.Verwenden von XPath zum Auswählen von untergeordnetem Text nach einem anderen untergeordneten Element

<div class="country"> 
    <strong> USA </strong> 
     Some text here 
</div> 

So kann ich versuche, diesen Text Etwas Text hier aber die Crawler-Bibliothek zu erhalten, nur um bekommen, was in einem Tag ist und nicht außerhalb.

Also jede Alternative bitte.

ist diese der Raupen Teil:

$crawler = new Crawler(); 
$crawler->xpathSingle($xml, '//div[@class="country"]/strong/@text'); 
+1

und was passiert, wenn Sie diesen XPath versuchen: '// div [@ class =" country "]/stark/nachgeschwister :: text()'? Fragen, weil ich nicht mit dieser "Crawler" -Bibliothek vertraut bin - ich weiß, dass XPath zum Beispiel mit lxml in Python funktioniert. –

+0

Danke, Alter, es funktioniert. Aber es wird der gesamte Text nach dem Tag "strong" angezeigt, auch wenn dieser Text zu einem anderen Tag gehört. – KubiRoazhon

Antwort

1

Jede dieser XPaths wird "Some text here" zurückkehren wie gewünscht:

  • normalize-space(substring-after(//div[@class="country"], 'USA'))

  • normalize-space(//div[@class="country"]/strong/following-sibling::text())

Wählen Sie basierend auf der Art der Variationen, die Sie unterbringen möchten.

Kredit: Zweites Beispiel von Vorschlag zuerst in comment von @Keith Hall gemacht abgeleitet wird.


aktualisieren:

Wie ich bereits erwähnt Sie Ihre XPath wählen müssen, basierend auf den Variationen, die Sie wünschen, zu empfangen. Kaum habe ich poste, als Sie eine Änderung aufgetreten:

<div class="country"> 
    <strong> USA </strong> 
     Some text here 
    <i>Do not want this text</i> 
</div> 

Sie können "Do not want this text" ausschließen und "Some text here" zurückkehren wie gewünscht über die zweite XPath verwenden, aber nur die ersten folgenden Textknoten greifen:

  • normalize-space(//div[@class="country"]/strong/following-sibling::text()[1])
+0

Es ist der zweite Tag. Der erste gibt 'USA' zurück. Danke Kumpel für die Hilfe – KubiRoazhon

+0

Aber es ist der gesamte Text nach dem starken Tag, auch wenn dieser Text zu einem anderen Tags gehört – KubiRoazhon

+0

Froh, dass die zweite geholfen, aber beachten Sie, dass die erste nicht zurück "USA" '; Es gibt '' Einige Texte hier '' wie gewünscht zurück. Wenn Sie zu viel Text nach 'strong' erhalten, zeigt Ihr Beispiel keinen solchen Fall, aber Sie können den zweiten XPath anpassen, indem Sie nur den ersten Textknoten über' [0] 'erfassen. Ich kann die Antwort aktualisieren, damit Sie es Ihnen zeigen können ... – kjhughes

Verwandte Themen