使用 XPath 和正则表达式提取 HTML 注释中的文本

Posted

技术标签:

【中文标题】使用 XPath 和正则表达式提取 HTML 注释中的文本【英文标题】:Extract text in HTML comment using XPath and regex 【发布时间】:2012-10-03 06:34:58 【问题描述】:

我正在尝试使用 XML/html 解析器解析 HTML 文件,其中包含用于翻译的隐藏注释文本,即下面的 X 和 Y。

<!-- Title: “ X ” Tags: “ Y ” -->

哪个 XPath 最适合 X 和 Y? //comment() 函数匹配整个节点,但我需要匹配 引号之间出现的两次文本。

我想需要结合使用 XPath 和正则表达式来做到这一点,但我不知道如何解决这个问题。

【问题讨论】:

你在使用 javascript 吗?然后请提及或添加标签或两者兼而有之。 你用什么语言实现这个? 【参考方案1】:

我假设评论中的引号是相同的,常规的 qoute 字符 " - 不是显示此问题时出现的印刷不同的开始和结束引号。

如果这个假设是错误的,只需将以下表达式中的标准引用替换为相应的引用。


使用(如果有问题的评论是文档中的第一个评论):

substring-before(substring-after(//comment(), '"'), '"')

这会产生字符串(不带引号):

“X”

对于引号中的第二个字符串,请使用:

substring-before(
   substring-after(
        substring-after(
               substring-after(//comment(), '"'), 
               '"'), 
        '"'), 
   '"')

基于 XSLT 的验证(因为 XSLT 样式表必须是格式良好的 XML 文档,我们将表达式中的引号替换为实体 &amp;quot; —— 只是为了避免由于嵌套引号引起的错误):

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="/">
     "<xsl:copy-of select="substring-before(substring-after(//comment(), '&quot;'), '&quot;')"/>"
=============
   "<xsl:copy-of select=
   "substring-before(substring-after(substring-after(substring-after(//comment(), '&quot;'), '&quot;'), '&quot;'), '&quot;')"/>"
 </xsl:template>
</xsl:stylesheet>

当此转换应用于此 XML 文档时:

<html>
  <body>
    Hello.
<!-- Title: " X " Tags: " Y " -->
  </body>
</html>

计算两个 XPath 表达式并将这两个计算的结果复制到输出中(用引号括起来以显示复制的确切字符串):

     " X "
=============
   " Y "

【讨论】:

以上是关于使用 XPath 和正则表达式提取 HTML 注释中的文本的主要内容,如果未能解决你的问题,请参考以下文章

jmeter获取响应数据中参数值的常用方式(JSON提取器 正则表达式提取器 XPath提取器 Bean Shell PostProcessor)

jmeter关联-正则表达和xpath

Python——XPath使用

Python Xpath语法

软件测试中正则表达式的应用

软件测试中正则表达式的应用