1

私はWeb-Harvestを使用してWebページの「スクレイピング」を行っています。整理する必要のある値の表があります。テーブルはとてもシンプルです。ただし、各列のデータ型を決定するには、テーブルの列見出しを使用する必要があります。テーブルはこんな感じ…。

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

Web-Harvestの例に示されているように、XQueryを使用しており、インデックスと属性(クラス、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]

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

前もって感謝します。

4

1 に答える 1

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>
于 2012-05-03T03:14:57.610 に答える