如何使用XPath从抓取的HTML解析作者姓名和书名?

时间:2010-10-18 15:56:30

标签: xpath

您在下面看到的HTML是我从远程站点抓取的文本,原样是一个局部变量。

现在我需要将HTML标记中的authorNamebookTitle解析为自己的变量,并给出以下一致格式的已删除文本:

<p>
  William Faulkner - 'Light In August'
  <br/>
  William Faulkner - 'Sanctuary'
  <br/>
  William Faulkner - 'The Sound and the Fury'
</p>

是否可以在XPath中执行此操作?

3 个答案:

答案 0 :(得分:2)

是。也很简单:

//p/text()

将为您提供三个单独的文本节点:

"
  William Faulkner - 'Light In August'
  ",
"
  William Faulkner - 'Sanctuary'
  ",
"
  William Faulkner - 'The Sound and the Fury'
"

请记住,前导和尾随空格(包括任何换行符)始终是文本节点的一部分。修剪结果。

我认为你不需要帮助将结果字符串分成作者和标题。

答案 1 :(得分:2)

在XPath 1.0中,您可以选择p的文本节点子项:

/p/text()

您还可以获取每个文本节点之前(作者)和之后(标题)-字符的字符串

substring-before(/p/text()[1],'-')

结果:

  William Faulkner 

substring-after(/p/text()[1],'-')

结果:

 'Light In August'       

在XPath 2.0中:

/p/text()/substring-before(.,'-')

产生3个项目的序列:

William Faulkner William Faulkner William Faulkner 

并且

/p/text()/substring-after(.,'-')

结果也包含3个项目:

'Light In August' 'Sanctuary' 'The Sound and the Fury'

答案 2 :(得分:1)

您可以使用此XPath表达式获取第N个作者姓名

substring-before(normalize-space(p/text()[$N]), ' -')

您可以使用此XPath表达式获取$ N-title

substring-after(normalize-space(p/text()[$N]), ' - ')

您可以首先获得所有文本节点的计数:

count(p/text())

然后你可以发出前两个XPath表达式,用$N替换区间中的数字

[1,count(p/text())]