2012-05-02 6 views
1

Web-Harvestを使用して、一部のWebページ「スクレイピング」を実行しています。私は整理する必要がある値のテーブルを持っています。テーブルはとてもシンプルです。ただし、各列のデータ型を判断するには、表の列見出しを使用する必要があります。表は、Web-収穫の例のように、私は、XQueryを使用している、と私はインデックスで値を取得する方法を知っているし、また、属性(クラス、IDを使用して....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> 

を次のようになりますなど)が、この場合には、私はその列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] 

それは、各行の祖先(親?)のためのように見えますが、対応する列見出しを見つけるために参照されています。それ以外は、私は失われています。追加情報があれば非常に役に立ちます。

ありがとうございます。

答えて

1

このXQuery式

<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> 

<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> 

を指名手配、正しい結果を生成します。提供されるXML文書に適用

<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>  

関連する問題