我使用 HTML Agility 打包从此网址获取元素的详细信息: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);
错误:其他信息:对象引用未设置为对象的实例。
答案 0 :(得分:1)
填充butiks
变量的XPath谓词似乎过于笼统。 contains(@class,'butik')
表达式也会匹配butik-large-image
,butik-name
等不具备您在foreach
循环体中尝试访问的某些后代元素的内容,这可能是例外的原因。尝试使用更具体的谓词,例如匹配div
class
完全等于'butik large'
(在Firefox的FirePath中测试XPath):
doc.DocumentNode.SelectNodes("//div[@class='butik large']");
答案 1 :(得分:0)
更改
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);