如何使用html链接提取文本?

时间:2016-05-13 14:09:47

标签: xquery basex

我尝试使用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>

1 个答案:

答案 0 :(得分:3)

使用XQuery Update和转换语句似乎对我来说有点过于复杂。您还可以选择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,您还可以利用辅助函数headtail

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