我正在使用HtmlAgilityPack从网页读取数据/字符串。
我的html在这里小提琴
这是我的代码
HtmlAgilityPack.HtmlDocument htmlDoc = new HtmlAgilityPack.HtmlDocument();
htmlDoc.OptionFixNestedTags = true;
HtmlNode.ElementsFlags.Remove("option");
htmlDoc.LoadHtml(s);
if (htmlDoc.DocumentNode != null){
HtmlAgilityPack.HtmlNode bodyNode = htmlDoc.DocumentNode.SelectSingleNode("//body");
if (bodyNode != null)
{//what to do here to get title and href?
var inputs = from input in htmlDoc.DocumentNode.Descendants("div")
where input.Attributes["class"].Value == "results-data-price-btn"
select input;
}
}
请指导我如何通过课程获得div值
答案 0 :(得分:0)
注意:以下内容尚未经过测试,我只是快速查看了网页的HTML,并尝试了解它是如何“适合”的。
每辆车的“结果”都有一个div
,其中包含search-results-box
类。所以....
var rootNode = htmlDoc.DocumentNode;
var allCarResults = rootNode.SelectNodes("//div[normalize-space(@class)='search-results-box']");
foreach (var carResult in allCarResults)
{
}
你有每个'汽车结果'(如同,每个项目现在是代表其中一辆汽车的整个部分......所以深入挖掘......
在其中的每一项中,汽车的数据都在另一个div
内,而班级search-results-data
......等......
var dataNode = carResult.SelectSingleNode(".//div[@class='search-results-data']");
在 this 中,您现在将深入挖掘。汽车的标题位于另一个元素内,特别是在孩子h2
内......
var carNameNode = dataNode.SelectSingleNode(".//h2/a");
string carName = carNameNode.InnerText.Trim();
由于HTML中可怕的标记,汽车的价格非常困难。
它位于另一个font
...
div
元素内
var carPriceNode = dataNode.SelectSingleNode(".//div[@class='results-data-price-btn']/font");
string carPrice = carPriceNode.InnerText.Trim(); // this will give you AED 24,500. Perform some logic to split that up so you just have the number...a
问题是价格在一个元素中被粘在一起为“AED 24,500”。因此,您可以轻松获得元素,但如果您只想要数字,那么您需要自己去做。
图片本身,很好。这是标记中的一个级别,在carResult
之下作为一个孩子备份,所以我们去.......
var carImageNode = carResult.SelectSingleNode(".//div[@class='search-results-img']/descendant::img");
string carImageSource = carImageNode.GetAttributeValue("src", string.Empty);
<强>重新修改
所有关于此二手车的更多详细信息都会填充到一个位置,因此以下内容适用于您的示例,但可能不适用于所有这些:
var descriptionNode = rootNode.SelectSingleNode("//div[@id='description']");
var entireDescription = descriptionNode.InnerText.Trim();
var splitUpDescriptionParts =
entireDescription.Split(
new[]
{
"More Details about this Used Car:", "Body Condition:", "Mechanical Condition:", "Doors:", "Cylinders:", "Body Style:",
"Drive Type:", "Warrenty:", "Description:"
},
StringSplitOptions.RemoveEmptyEntries).Select(s => s.Trim()).Where(s => !string.IsNullOrWhiteSpace(s));
string bodyCondition = splitUp.First();
string mechancialCondition = splitUp.ElementAt(1);
string amountOfDoors = splitUp.ElementAt(2);
string amountOfCylinders = splitUp.ElementAt(3);
string bodyStyle = splitUp.ElementAt(4);
string driveType = splitUp.ElementAt(5);
string warranty = splitUp.ElementAt(6);
string description = splitUp.Last();