1

以下は、経済カレンダーのスクリーン スクレイピングに使用されるコードの抜粋です。XPath を使用して解析する HTML ページには、この行がテーブルの最初の行として含まれます。(HTML ページ全体ではなく、この行のみを貼り付けました。)

<tr class="calendar_row newday singleevent" data-eventid="42064"> <td class="date"><div class="date">Sun<div>Dec 23</div></div></td> <td class="time">All Day</td> <td class="currency">JPY</td> <td class="impact"> <div title="Non-Economic" class="holiday"></div> </td> <td class="event"><div>Bank Holiday</div></td> <td class="detail"><a class="calendar_detail level1" data-level="1"></a></td> <td class="actual"> </td> <td class="forecast"></td> <td class="previous"></td> <td class="graph"></td> </tr>

XPath を使用して最初の tr 行を選択するこのコード:

var doc = new HtmlDocument();
doc.Load(new StringReader(html));
var rows = doc.DocumentNode.SelectNodes("//tr[@class=\"calendar_row\"]");
var rowHtml = rows[0].InnerHtml;

問題は、rowHtml がこれを返すことです。

<td class="date"></td> <td class="time">All Day</td> <td class="currency">EUR</td> <td class="impact">  <div title="Non-Economic" class="holiday"></div>  </td> <td class="event"> <div>French Bank Holiday</div> </td> <td class="detail"><a class="calendar_detail level2" data-level="2"></a></td> <td class="actual"> </td> <td class="forecast"></td> <td class="previous"></td> <td class="graph"></td>

これで、日付の td 列の内容が消えたことがわかります! なんで?

私は多くのことを実験し、なぜそのコラムの内容が削除されたのかについて困惑しました。他の列には、それが保持するコンテンツがあります。では、日付列の何が問題なのですか?

コンテンツのドロップを引き起こす、または防ぐための何らかの設定またはプロパティがどこかにありますか?

何が問題なのか手がかりがなくても、さらに調査する方法についていくつか提案があります。

4

1 に答える 1

2

@AlexeiLevenkovが述べたように、必要なものとは異なる行を選択する必要があります。単純化するために本質的な問題を削除しすぎましたが、何が問題なのかは明らかです...

入力ドキュメントは基本的に次のようになると考えてください。

<?xml version="1.0" encoding="UTF-8"?>
<table>
  <tr class="calendar_row" data-eventid="12345">
    <td>This IS NOT the tr you're looking for</td>
  </tr>
  <tr class="calendar_row newday singleevent" data-eventid="42064">
    <td>This IS the tr you're looking for</td>
  </tr>
</table>

テスト@class="calendar_row"trあなたが示すものとは一致しませんが、最初の行とは一致します。

代わりにテストを変更することもできますcontains(@class,'calendar_row')が、それは両方の行に一致します。目的の行に固有のコンテンツまたは属性を特定する必要があります。おそらく、この@data-eventid属性は機能するでしょう。入力ファイル全体を見ないとわかりません。

于 2013-09-27T02:03:28.420 に答える