Die Webseiten, die ich kratzen möchte, haben ähnliche Strukturen. Jeder hat einen Absatz, der eine Frage ist, und einen Absatz, der eine Antwort ist. Ich möchte jede Frage kratzen und beantworten und in zwei Elementen speichern

Das Problem ist, dass auf einigen Seiten die Frage und die Antwort //xxx/p[1] bzw. //xxx/p[2] sind, auf anderen Seiten jedoch //xxx/p[1] ein leerer Absatz ohne Text ist, der als zusätzlicher Platz. Für diese Seiten gibt mir //xxx/p[1] nicht das, was ich wünsche.

Gibt es also einen XPath-Ausdruck, der nicht leere Absätze unter einem Knoten auswählen kann?

3
Joseph Zhou 4 Jän. 2016 im 20:28

2 Antworten

Beste Antwort

Wenn es überhaupt keinen Text gibt, können Sie verwenden

//p[.//text()]

Absätze mit Text auswählen. Wenn die "leeren" Absätze Leerzeichen enthalten (z. B. Zeilenumbrüche), müssen Sie zuerst das Leerzeichen normalisieren:

//p[normalize-space(.//text())]

Was verkürzt werden kann auf

//p[normalize-space()]
3
choroba 4 Jän. 2016 im 21:20

Wenn Sie nicht leer so definieren, dass der Absatz Inhalte jeglicher Art enthält, ist der folgende XPath genau das, was Sie möchten:

//xxx/p[node()]

Dies wählt nicht <p/> und <p></p> aus, wählt jedoch jeweils Folgendes aus:

  1. <p>Text</p>
  2. <p><b>Text</b></p>
  3. <p><br/></p>
  4. <p><!-- comment --></p>

Wenn Sie sich wirklich nur um Textinhalte kümmern, schließt der folgende XPath <p/> und <p></p> zusammen mit den obigen Fällen 3 und 4 aus:

//xxx/p[string(.)]

Mit anderen Worten, es werden nur die Fälle 1 und 2 ausgewählt. In diesen Fällen ist der Zeichenfolgenwert des Absatzes nicht leer.

2
kjhughes 4 Jän. 2016 im 18:21