1

Digikey用のスクリーンスクレイパーを作成しようとしています。これにより、当社は、部品が製造中止になったときに、価格設定、部品の入手可能性、および製品の交換を正確に追跡できます。Chrome DevtoolsとFirefoxのFirebugで表示されているXPATHと、C#プログラムで表示されているものとの間に不一致があるようです。

私が現在スクレイピングしているページはhttp://search.digikey.com/scripts/DkSearch/dksus.dll?Detail&name=296-12602-1-NDです。

私が現在使用しているコードはかなり速くて汚いです...

   //This function retrieves data from the digikey
   private static List<string> ExtractProductInfo(HtmlDocument doc)
   {
       List<HtmlNode> m_unparsedProductInfoNodes = new List<HtmlNode>();
       List<string> m_unparsedProductInfo = new List<string>();

       //Base Node for part info
       string m_baseNode = @"//html[1]/body[1]/div[2]";

       //Write part info to list
       m_unparsedProductInfoNodes.Add(doc.DocumentNode.SelectSingleNode(m_baseNode + @"/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]"));
       //More lines of similar form will go here for more info
       //this retrieves digikey PN

       foreach(HtmlNode node in m_unparsedProductInfoNodes)
       {
           m_unparsedProductInfo.Add(node.InnerText);
       }

       return m_unparsedProductInfo;
   }

使用しているパスは「正しい」ように見えますが、リスト「m_unparsedProductInfoNodes」を見るとNULLになり続けています。

ここで何が起こっているのか分かりますか?また、baseNodeで「SelectNodes」を実行すると、ブラウザのユーザーエージェントによって異なるように見える「cs=####」だけが重要な子を持つdivのみが返されることも追加します。とにかくこれを使用しようとすると(識別できないブラウザーのパスに/ cs = 0を入れる)、式がノードセットに評価されないことを主張するフィットを提案しますが、それらを残すと、過去のすべてのデータの問題が残りますdiv[2]はNULLとして返されます。

4

2 に答える 2

0

次の XPath 式を使用してみてください。

/html[1]/body[1]/div[2]/cs=0[1]/rf=141[1]/table[1]/tr[1]/td[1]/table[1]/tr[1]/td[1]

Firefox で Google Chrome Developer Tools と Firebug を使用すると、Web ページの最初のテーブルの前に「cs」タグと「rf」タグがあるようです。何かのようなもの:

<cs="0">
  <rf="141">
    <table>
    ...
    </table>
  </rf>
</cs>

既知のHTML ファイルを解析したいのに、期待どおりの結果が得られない場合に、何が起こっているのかを知るのに役立つことがあります。この場合、私はちょうどやった:

string xpath = "";

//In this case I'll get all cells and see what cell has the text "296-12602-1-ND"

foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//td"))
{
    if (node.InnerText.Trim() == "296-12602-1-ND")
        xpath = node.XPath; //Here it is
}

または、ドキュメントの読み込み後にアプリケーションをデバッグし、情報を取得したいノードが見つかるまで各子ノードを調べることもできます。InnerText が見つかったときにブレークポイントを設定した場合は、親を調べて、他のノードを探し続けることができます。私は通常、「ウォッチ」ウィンドウに手動でコマンドを入力し、ツリービューを使用してナビゲートして、プロパティ、属性、および子を表示します。

于 2010-03-25T02:33:09.987 に答える
0

更新のためだけに:

私は c# からもう少し親しみやすい Python に切り替え (私のプログラミング経験は asm、c、および python で、オブジェクト指向はまったく新しいものでした)、xpath の問題を修正することができました。タグは確かに問題でしたが、幸いにもユニークなので、少し正規表現と削除された行があり、調子が良かったです。ただし、そのようなタグが XPATH を壊す理由はわかりません。誰かが洞察力を持っているなら、私はそれを聞きたいです。

于 2010-03-26T19:07:12.853 に答える