C#HTML Agility Pack単一選択ノードがnullを返す

c# html-agility-pack web-scraping winforms

質問

私はC#、Windowsフォーム、およびHTMLアジリティパックを使用して開発されたWebスクレーパーを持っています。

サイトがコードを変更して壊したとき、私はすべてうまくいっていました。私はそれがウェブスクレーパーで頻繁に起こることを知っていますが、今は問題を解決する方法を考え出すのに困っています。

現時点では、私のスクレーパーは複数のURLをループし、各ページからデータをスクラップします。

私が実行している問題は、ループしているサイトのテンプレートが、プログラムで定義した同じHTMLクラスとIDを持たない新しいテンプレートをランダムに表示することです。私がしようとしているのは、もし単一のノードがヌルならばそれが新しいテンプレートのための別のコードセットを実行しているかどうかを調べるならば単純なものです。

私が抱えている問題は、私のプログラムが私のif文でNullReferenceExceptionをスローすることです。

ここでは、それがnullかどうかを確認するために使用しているステートメントです:

var varitem = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']").InnerText;

 if (varitem == null) MessageBox.Show("no titles");

varitemを定義する最初の行に例外がスローされ、if文にさえも渡されません。

どんなアドバイスもありがとう!

受け入れられた回答

まず、

 doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']")

nullを返します。

nullの場合は、 null.InnerTextからNullReferenceExceptionを取得します。


人気のある回答

以下を試してください

var varitem = doc.DocumentNode.SelectSingleNode("//h1[@class='producttitle']");

SelectSingleNodeはnullを返すことができます。また、 InnerTextもnullでも空でもないかどうかをよく確認します

if (varitem == null || string.IsNullOrEmpty(varitem.InnerText))
              MessageBox.Show("no titles");


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow