试图找到多个TD的XPath

时间:2013-06-18 02:58:42

标签: xpath web-scraping

我想提取此表的特定数字(第一个TD)的地址。该表的唯一唯一标识符是H3。

以下是表格的代码:

<table width="95%" cellpadding=5 cellspacing=0 border=1>
    <tr><td colspan="4"><h3>The list</td></tr>
    <tr>
        <td>Number</td><td>First Name</td>
        <td>Last Name</td><td>Address</td>
   </tr>

我试过了:

//table[@h3=’See this now’]/’tr/td[87] and td[107] and td[116]

我是xpath的新手,也是一般的编程。这很有趣,但是很想能够把这个想出来!感谢任何帮助:D

1 个答案:

答案 0 :(得分:1)

首先,你的HTML是错误的。

  • 您没有关闭Table元素。
  • 你没有关闭你的H3元素。
  • 您必须将属性括在引号中。

     <table width="95%" cellpadding="5" cellspacing="0" border="1"> 
       <tr> 
         <td colspan="4"> 
           <h3>The list</h3> 
         </td> 
       </tr>
       <tr> 
         <td>Number</td> 
         <td>First Name</td>  
         <td>Last Name</td> 
         <td>Address</td>
      </tr>
    </table>
    

修复XHTML的格式后。您可以遍历文档树。

XPATH

任何表格,任何td都有h3。

//table//td/h3

将返回

<h3>The list</h3>

编号

//table//tr[2]/td[1]    <-- any table, the second tr element in this table, the first td in that second tr

将返回

<td>Number</td>

因此,如果我们向文档中添加多个表,并且您希望在任何表中找到每个元素的多个结果,这非常简单。假设我们有一个XHTML文档,在父元素中包含许多表,例如&#39; root&#39;元件。

<root>
    <table width="95%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <td colspan="4">
                <h3>The list</h3>
            </td>
        </tr>
        <tr>
            <td>123</td>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Address</td>
        </tr>
    </table>
    <table width="95%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <td colspan="4">
                <h3>The list</h3>
            </td>
        </tr>
        <tr>
            <td>456</td>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Address</td>
        </tr>
    </table>
    <table width="95%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <td colspan="4">
                <h3>The list</h3>
            </td>
        </tr>
        <tr>
            <td>789</td>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Address</td>
        </tr>
    </table>
</root>

我们可以使用以下XPATH表达式提取每个表中每第二行中第一个表数据的数量:

//table/tr[2]/td[1]

这将给我们

的结果
<td>123</td>
-----------------------
<td>456</td>
-----------------------
<td>789</td>

现在,假设我们有几个表,但只有一个表对我们非常重要,表必须有一个H3元素,没有其他元素对我们很重要,如果这个表有一个H3元素,我们想要提取第二行首先是td。

<root>
    <table width="95%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <td colspan="4">
                <h4>Ignore me!</h4>
            </td>
        </tr>
        <tr>
            <td>1164961564896</td>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Address</td>
        </tr>
    </table>
    <table width="95%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <td colspan="4">
                <h1>I'm not interesting</h1>
            </td>
        </tr>
        <tr>
            <td>456456466465</td>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Address</td>
        </tr>
    </table>
    <table width="95%" cellpadding="5" cellspacing="0" border="1">
        <tr>
            <td colspan="4">
                <h3>IM THE IMPORTANT TABLE!</h3>
            </td>
        </tr>
        <tr>
            <td>123456789</td>
            <td>First Name</td>
            <td>Last Name</td>
            <td>Address</td>
        </tr>
    </table>
</root>

如果我们成功找到H3元素,我们可以通过遍历树来完成这个,然后转到下一个tr。

//table//h3/../../../tr/td[1]

将返回

<td colspan="4">
<h3>IM THE IMPORTANT TABLE!</h3>
</td>
-----------------------
<td>123456789</td>