【问题标题】:Xpath on HTML, finding conditional matchHTML上的Xpath,查找条件匹配
【发布时间】:2015-02-10 20:28:52
【问题描述】:

我有一个 HTML 文档,并且正在尝试为某些表格行提取 href。渲染后,该表有几列。每个名称都是一个超链接,但我正在尝试捕获第四列中具有空白值的名称的超链接。那是因为第四列包含终止日期,而我只对在职(未终止)员工感兴趣。

这是 HTML 响应的子集:

<tr id="r6" >                                    
<td>
   <a href="benefits.asp?SK=177646822&STYPE=ELNAME&QRY=a">111-11-1111</a>
</td>
<td >
   <a href="benefits.asp?SK=177646822&STYPE=ELNAME&QRY=a">Lastname</a>
</td>
<td nowrap="nowrap" >
   <a href="benefits.asp?SK=177646822&STYPE=ELNAME&QRY=a">Firstname</a>
</td>
<td nowrap="nowrap" >
   &nbsp;
</td>
<td>
   <a href="benefits.asp?SK=177646822&STYPE=ELNAME&QRY=a">743</a>
</td>
</tr>

<tr id="r7" >                                    
<td>
   <a href="benefits.asp?SK=177646782&STYPE=ELNAME&QRY=a">222-22-2222</a>
</td>
<td >
   <a href="benefits.asp?SK=177646782&STYPE=ELNAME&QRY=a">Ignore</a>
</td>
<td nowrap="nowrap" >
   <a href="benefits.asp?SK=177646782&STYPE=ELNAME&QRY=a">This</a>
</td>
<td nowrap="nowrap" >
   <a href="benefits.asp?SK=177646782&STYPE=ELNAME&QRY=a">7/12/2010</a>
</td>
<td>
   <a href="benefits.asp?SK=177646782&STYPE=ELNAME&QRY=a">1070</a>
</td>
</tr>

上面的第一行 (id=r6) 缺少第 4 列中的日期字段,该字段存在于第二行中。所以我试图提取第一个而不是第二个的href。换句话说,“给我第 4 列中包含 &amp;nbsp; 的每个表格行的第一个 href。”

FirePath 中的这给了我表中的所有href: //table[@id="searchResults"]//@href

谢谢

【问题讨论】:

    标签: html xpath firepath


    【解决方案1】:

    答案取决于您使用 XPath 的环境。具体而言,它取决于不间断空格的编码方式。例如,在 XSLT 中,表达式看起来像

    //tr[contains(td[4],'&#160;')]/td[1]/a/@href
    

    输入(稍作修改)

    <?xml version="1.0"?>
    <!DOCTYPE root [
        <!ENTITY nbsp "&#160;">
    ]>
    <root>
    <tr id="r6" >                                    
    <td>
       <a href="YES">111-11-1111</a>
    </td>
    <td >
       <a href="benefits.asp?SK=177646822STYPE=ELNAMEQRY=a">Lastname</a>
    </td>
    <td nowrap="nowrap" >
       <a href="benefits.asp?SK=177646822STYPE=ELNAMEQRY=a">Firstname</a>
    </td>
    <td nowrap="nowrap" >
       &nbsp;
    </td>
    <td>
       <a href="benefits.asp?SK=177646822STYPE=ELNAMEQRY=a">743</a>
    </td>
    </tr>
    
    <tr id="r7" >                                    
    <td>
       <a href="benefits.asp?SK=177646782STYPE=ELNAMEQRY=a">222-22-2222</a>
    </td>
    <td >
       <a href="benefits.asp?SK=177646782STYPE=ELNAMEQRY=a">Ignore</a>
    </td>
    <td nowrap="nowrap" >
       <a href="benefits.asp?SK=177646782STYPE=ELNAMEQRY=a">This</a>
    </td>
    <td nowrap="nowrap" >
       <a href="benefits.asp?SK=177646782STYPE=ELNAMEQRY=a">7/12/2010</a>
    </td>
    <td>
       <a href="benefits.asp?SK=177646782STYPE=ELNAMEQRY=a">1070</a>
    </td>
    </tr>
    </root>
    

    样式表

    <?xml version="1.0" encoding="UTF-8" ?>
    <xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="2.0">
        <xsl:output method="text" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
    
        <xsl:template match="/">
              <xsl:value-of select="//tr[contains(td[4],'&#160;')]/td[1]/a/@href"/>
        </xsl:template>
    
    </xsl:transform>
    

    输出

    YES
    

    【讨论】:

      猜你喜欢
      • 2012-11-14
      • 2012-02-23
      • 1970-01-01
      • 2018-05-07
      • 1970-01-01
      • 1970-01-01
      • 2020-02-25
      • 1970-01-01
      • 2022-11-24
      相关资源
      最近更新 更多