HTMLアジャイルパック - 常に最初の要素の詳細を取得する

c# html-agility-pack

質問

私はこのURLから要素の詳細を取得するためにHTML Agility Packを使用していますLink

私はC#(Windowsフォームアプリケーション)でこのコードを使用しています:

var webGet = new HtmlWeb();
    doc = webGet.Load("http://www.trendyol.com/Butik/Liste/Kadin");

    HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");
    richTextBox1.Text = butiks.Count().ToString();

    if (butiks != null)
    {
        foreach (HtmlNode element in butiks)
        {
            var butikUrl = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("href", null);
            var butikTitle = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("title", null);
            var butikImg = element.SelectSingleNode("//div[@class='butik-large-image']//a/img").GetAttributeValue("src", null);
            var butikEndTime = element.SelectSingleNode("//div[@class='butik-name']/div[@class='butikTimeLine']/a/div[@class='timelineMain']/h1").GetAttributeValue("enddate", null);
            dataGridView1.Rows.Add("", butikUrl, butikTitle, butikImg, butikEndTime);
        }

    }
    else
    {
        MessageBox.Show("Null Obeject...!");
    }

このコードは常に要素の詳細を返します。 手伝ってくれますか?

私も次のコードを使用しましたが、次のエラーが発生します:

var webGet = new HtmlWeb();
    doc = webGet.Load("http://www.trendyol.com/Butik/Liste/Kadin");

    HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");
    richTextBox1.Text = butiks.Count().ToString();

    if (butiks != null)
    {
        foreach (HtmlNode element in butiks)
        {
            var butikUrl = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("href", null);
            var butikTitle = element.SelectSingleNode("//div[@class='butik-large-image']/a").GetAttributeValue("title", null);
            var butikImg = element.SelectSingleNode("//div[@class='butik-large-image']//a/img").GetAttributeValue("src", null);
            var butikEndTime = element.SelectSingleNode("//div[@class='butik-name']/div[@class='butikTimeLine']/a/div[@class='timelineMain']/h1").GetAttributeValue("enddate", null);
            dataGridView1.Rows.Add("", butikUrl, butikTitle, butikImg, butikEndTime);
        }

    }
    else
    {
        MessageBox.Show("Null Obeject...!");
    }

このエラーは、 var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

エラー:追加情報:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

受け入れられた回答

butiks変数を設定するXPath述語はあまり一般的ではないようです。 contains(@class,'butik')式は、 foreachループ本体でアクセスしようとしている特定の子孫要素を持たないbutik-large-imagebutik-nameなどにも一致します。例外。より正確な述語を使用するようにしてください。たとえば、 class正確に'butik large' (FirefoxのFirePathでテストされたXPath)に等しいdivを照合するなどしてください。

doc.DocumentNode.SelectNodes("//div[@class='butik large']");

人気のある回答

変化する

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");

これにより、積み重ねられた20の広告要素が返されます。

NodeCollectionで、他の広告のNodeCollectionをつかむことができます

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");

私は自宅でHtmlAgilityPackのWebスクラップコードをいくつか持っているので、あなたのやり方を狙って助けてくれるかもしれません。

編集:あなたはLINQで2つのリストに参加することができます

HtmlNodeCollection butiks = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik')]");



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ