HTML敏捷包——总是获取第一个元素的详细信息

本文关键字:第一个 元素 详细信息 获取 HTML | 更新日期: 2023-09-27 18:12:38

我正在使用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);

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

HTML敏捷包——总是获取第一个元素的详细信息

填充butiks变量的XPath谓词似乎太笼统了。contains(@class,'butik')表达式也将匹配butik-large-image, butik-name等,它们没有您试图在foreach循环体中访问的某些后代元素,这可能是异常的原因。尝试使用更具体的谓词,例如让class完全等于'butik large'来匹配div (XPath在Firefox的FirePath中进行了测试):

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);