我一直在处理html,总是使用Regex
来获取结果。每次我寻求帮助时,每个人都建议使用HTML解析器,例如HTMLAgilitypack。
我只是尝试过它和男人,此刻对我来说太过分了。 这就是我尝试枚举html代码的范围
的方法private static string _InetReadEx(string sUrl)
{
try
{
HtmlWeb website = new HtmlWeb();
HtmlDocument htmlDoc = website.Load(sUrl);
var allElementsWithClassFloat = htmlDoc.DocumentNode.SelectNodes("//div[contains(@class,'pid')]");
for (int i = 0; i < allElementsWithClassFloat.Count; i++)
{
Console.WriteLine(allElementsWithClassFloat[i].InnerText);
}
return aRet;
}
catch (Exception ex)
{
throw ex;
}
}
我收到错误Expression must evaluate to a node-set
我上传了HTML文件here,因为它太大而无法在帖子上添加 我需要枚举所有包含“pid”的类。
答案 0 :(得分:1)
你的XPath中可能是逗号(,
)和右括号()
)吗?看起来对我不对。
应该是"//div[@class='pid']"
,尽管这是完全匹配的。如果要在类属性值中的任何位置选择包含“ pid ”的任何元素,可以使用"//div[contains(@class,'pid')]"
坚持使用HtmlAgilityPack - 我已经使用了很多,因为网上的大多数HTML都是垃圾,甚至不是有效的XML!
答案 1 :(得分:1)
我认为你需要像
这样的东西private static List<string> _InetReadEx(string sUrl) // Returns string list
{
var aRet = new List<string>(); // string list var
try
{
var website = new HtmlAgilityPack.HtmlWeb(); // Init the object
var htmlDoc = website.Load(sUrl); // Load doc from URL
var allElementsWithClassFloat = htmlDoc.DocumentNode.SelectNodes("//*[contains(@class,'pid')]"); // Get all nodes with class value containing pid
if (allElementsWithClassFloat != null) // If nodes found
{
for (int i = 0; i < allElementsWithClassFloat.Count; i++)
{
if (!string.IsNullOrWhiteSpace(allElementsWithClassFloat[i].InnerText) && // if not blank/null
!aRet.Contains(allElementsWithClassFloat[i].InnerText)) // if not already present
{
aRet.Add(allElementsWithClassFloat[i].InnerText); // Add to result
Console.WriteLine(allElementsWithClassFloat[i].InnerText); // Demo line
}
}
}
return aRet;
}
catch (Exception ex)
{
throw ex;
}
}
XPath是//*[contains(@class,'pid')]
:
//*
- 获取所有元素节点...... [contains(
- 包含... @class,'pid'
- pid
属性值class
子字符串
)]
- contains
条件