HTML Agility Pack-始终获取第一个元素详细信息
HTML Agility Pack-Get always the first element details
我正在使用 HTML Agility Pack to fetch element's details from this 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...!");
}
此代码总是 return 元素详细信息。 你能帮忙吗?
我也用过下面的代码,但是出现如下错误:
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-image
、butik-name
等,它们没有您试图在 foreach
循环体中访问的某些后代元素,这可能是异常的原因。尝试使用更具体的谓词,例如通过匹配 div
使 class
正好等于 'butik large'
(在 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')]");
这应该 return 20 个堆叠的广告元素。
然后您可以使用
获取另一个 NodeCollection
的其他广告
HtmlNodeCollection butiks2 = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik small left')]");
我家里有一些 HtmlAgilityPack 网络抓取代码,我可以按照您的方式拍摄,它们也可能会有所帮助。
编辑:
您可以使用 LINQ
加入两个列表
butiks.Union(butiks2);
我正在使用 HTML Agility Pack to fetch element's details from this 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...!");
}
此代码总是 return 元素详细信息。 你能帮忙吗?
我也用过下面的代码,但是出现如下错误:
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-image
、butik-name
等,它们没有您试图在 foreach
循环体中访问的某些后代元素,这可能是异常的原因。尝试使用更具体的谓词,例如通过匹配 div
使 class
正好等于 'butik large'
(在 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')]");
这应该 return 20 个堆叠的广告元素。
然后您可以使用
获取另一个NodeCollection
的其他广告
HtmlNodeCollection butiks2 = doc.DocumentNode.SelectNodes("//div[contains(@class,'butik small left')]");
我家里有一些 HtmlAgilityPack 网络抓取代码,我可以按照您的方式拍摄,它们也可能会有所帮助。
编辑: 您可以使用 LINQ
加入两个列表butiks.Union(butiks2);