HtmlAgilitypack枚举所有类

时间:2016-10-15 17:31:46

标签: c# html regex parsing enums

我一直在处理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”的类。

2 个答案:

答案 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条件
  • 的结尾