Web-Harvest按表列标题确定数据类型

时间:2012-05-02 19:29:26

标签: xml html-parsing xquery webharvest

我正在使用Web-Harvest来做一些网页“刮”。我有一个值得组织的表格。桌子很简单。但是,我需要使用表的列标题来确定每列的数据类型。表格看起来像这样....

<table>
  <tr class="header">
    <td>Name</td>
    <td>Age</td>
    <td>Gender</td>
  </tr>
  <tr>
    <td>Bill</td>
    <td>25</td>
    <td>M</td>
  </tr>
  <tr>
    <td>Emily</td>
    <td>31</td>
    <td>F</td>
  </tr>
</table>

我正在使用XQuery,如Web-Harvest示例所示,我知道如何通过索引获取值并使用属性(类,id等),但在这种情况下,我不确定如何确定第1列是名称,第2列是年龄等...我想以这种形式输出XML ...

<person>
  <name>Bill</name>
  <age>25</age>
  <gender>M</gender>
</person>
<person>
  <name>Emily</name>
  <age>31</age>
  <gender>F</gender>
</person>

我在另一篇文章中看到了这段代码片段,但我不确定它是如何工作的。

//tr[td[.="Jim"]]/td[count(ancestor::table/thead/tr/th[.="Credit"]/preceding-sibling::*)+1]

看起来每个行都引用了祖先(parent?)来查找相应的列标题。除此之外,我迷路了。任何其他信息都会非常有用。

提前致谢。

1 个答案:

答案 0 :(得分:1)

此XQuery表达式

  <persons>
   {
   let $names := /*/tr[1]/td
     return
         for $tr in /*/tr[position() ge 2]
           return
             <person>
               { for $i in 1 to count($tr/td)
                   return
                     element {$names[$i]} {$tr/td[$i]}
               }
            </person>
     }
   </persons>     

应用于提供的XML文档

<table>
  <tr class="header">
    <td>Name</td>
    <td>Age</td>
    <td>Gender</td>
  </tr>
  <tr>
    <td>Bill</td>
    <td>25</td>
    <td>M</td>
  </tr>
  <tr>
    <td>Emily</td>
    <td>31</td>
    <td>F</td>
  </tr>
</table>

生成想要的正确结果

<persons>
   <person>
      <Name>
         <td>Bill</td>
      </Name>
      <Age>
         <td>25</td>
      </Age>
      <Gender>
         <td>M</td>
      </Gender>
   </person>
   <person>
      <Name>
         <td>Emily</td>
      </Name>
      <Age>
         <td>31</td>
      </Age>
      <Gender>
         <td>F</td>
      </Gender>
   </person>
</persons>