【发布时间】:2016-10-15 17:31:45
【问题描述】:
我一直在处理 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”的类。
【问题讨论】:
-
您可以通过删除
HttpWebRequest来缩短代码,因为 HtmlAgilityPack 可以加载 html 文件。如果您想获取所有名称为div且classattr 等于pid的标签,请使用"//div[@class='pid']" -
@WiktorStribiżew 我的对象引用未设置为引发的对象异常的实例。
-
@WiktorStribiżew 感谢您的提示。我修改了方法。希望做对了。
-
这是因为该文件不包含任何
div标记,其class属性值包含pid。请制定您需要从该文件中提取的内容。此外,为了避免使用try..catch和这些异常,您应该检查对象是否不为空。var allElementsWithClassFloat = htmlDoc.DocumentNode....然后if (allElementsWithClassFloat != null) { /*Process*/ } -
那么你需要
"//*[contains(@class,'pid')]"。另外,如果你不需要空值,不要忘记添加if (!string.IsNullOrWhiteSpace(allElementsWithClassFloat[i].InnerText)),如果你不需要dupes,你也可以检查if (!aRet.Contains(allElementsWithClassFloat[i].InnerText))
标签: c# html regex parsing enums