HTML敏捷包 - 始终获取第一个元素详细信息

c# html-agility-pack

我正在使用HTML Agility Pack从此URL获取元素的详细信息: 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 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);

此错误适用于var butikUrl = element.SelectSingleNode(".//div[@class='butik-large-image']/a").GetAttributeValue("href", null);

错误:附加信息:未将对象引用设置为对象的实例。

一般承认的答案

用于填充butiks变量的XPath谓词似乎过于笼统。 contains(@class,'butik')表达式也会匹配butik-large-imagebutik-name等,它们没有你试图在foreach循环体中访问的某些后代元素,这可能是导致例外。尝试使用更具体的谓词,例如匹配具有class恰好等于'butik large' div (在Firefox的FirePath中测试的XPath):

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-large-image')]");

这应该返回20个堆叠的广告元素。

然后,您可以使用其他广告获取另一个NodeCollection

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

我在家里有一些HtmlAgilityPack网络报废代码,我可以按你的方式拍摄他们可能也会提供的帮助。

编辑:您可以使用LINQ加入这两个列表

butiks.Union(butiks2);


Related

许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因