2016-05-13 15 views
2

Ich versuche, eine HTML-Seite mit BaseX zu analysieren. Von diesem Teil des Codes:Wie extrahiert man Text mit HTML-Link?

<td colspan="2" rowspan="1" class="light comment2 last2"> 
    <img class="textalign10" src="templates/comment10.png" 
     alt="*" width="10" height="10" border="0"/> 
    <a shape="rect" href="mypage.php?userid=26682">user</a> 
    : the text I'd like to keep [<a shape="rect" 
    href="http://alink" rel="nofollow">Link</a>] . with that part too. 
</td> 

Ich brauche die Nachricht mit dem a HTML-Link zu extrahieren, und die ersten : Zeichen am Anfang entfernen.

Ich möchte diese genauen Text erhalten:

<message> 
the text I'd like to keep [<a shape="rect" href="http://alink" rel="nofollow">Link</a>] . with that part too. 
</message> 

Mit Hilfe dieser Funktion

declare 
function gkm:node_message_from_comment($comment as item()*) { 
    if ($comment) then 
    copy $c := $comment 
    modify (
     delete node $c/img[1], 
     delete node $c/a[1], 
     delete node $c/@*, 
     rename node $c as 'message' 
    ) 
    return $c 
    else() 
}; 

ich den Text extrahieren, aber ich konnte die : von Anfang an entfernen. dh:

<message> 
: the text I'd like to keep [<a shape="rect" href="http://alink" rel="nofollow">Link</a>] . with that part too. 
</message> 

Antwort

3

Mit XQuery Update und Transformation Aussagen scheint ein wenig zu mir zu kompliziert. Sie können auch die Knoten auswählen, die der mypage.php-Verknüpfung folgen. Mit mehr Wissen über die Eingabe könnte es auch bessere Möglichkeiten geben, die benötigten Knoten auszuwählen.

Um den : Teilstring zu schneiden, verwenden Sie substring-after. Das Muster ": vom ersten Ergebnisknoten abschneiden und alle anderen zurückgeben wie es ist" ist auch anwendbar, wenn Transformationsanweisungen verwendet werden, wenn Sie darauf bestehen, sie zu verwenden.

let $comment :=<td colspan="2" rowspan="1" class="light comment2 last2"> 
    <img class="textalign10" src="templates/comment10.png" alt="*" width="10" height="10" border="0"/> 
    <a shape="rect" href="mypage.php?userid=26682">user</a> 
    : the text I'd like to keep [<a shape="rect" href="http://alink" rel="nofollow">Link</a>] . with that part too. 
</td> 
let $result := $comment/a[starts-with(@href, 'mypage.php')]/following-sibling::node() 
return <message>{ 
    $result[1]/substring-after(., ': '), 
    $result[position() > 1] 
}</message> 

Als BaseX unterstützt XQuery 3.0, könnten Sie auch die Vorteile der Helferfunktionen nehmen head und tail:

return <message>{ 
    head($result)/substring-after(., ': '), 
    tail($result) 
}</message> 
+0

funktioniert perfekt, danke :) – KumZ

Verwandte Themen