2016-05-13 1 views
2

Я пытаюсь проанализировать HTML-страницу с помощью BaseX. Из этой части кода:Как извлечь текст с помощью ссылки html?

<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> 

Мне нужно, чтобы извлечь сообщение с ссылкой a HTML, и удалить первые : символы в начале.

Я хотел бы получить именно этот текст:

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

Используя эту функцию,

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() 
}; 

я могу извлечь текст, но я не смог удалить : от начала. т.е.

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

ответ

3

Использование обновления и трансформации отчетности XQuery кажется немного усложненной мне. Вы также можете выбрать узлы, следующие за ссылкой mypage.php; с большим количеством знаний на входе, также могут быть лучшие способы выбора нужных узлов.

Чтобы отрезать подстроку :, используйте substring-after. Образец «обрезает : с первого узла результата и возвращает все остальные как есть», также применим при использовании операторов преобразования, если вы настаиваете на их использовании.

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> 

Как Basex поддерживает XQuery 3.0, вы также можете воспользоваться вспомогательными функциями head и tail:

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

отлично работает, спасибо :) – KumZ