HtmlAgilityPack HasAttribute?

时间:2010-11-03 18:12:35

标签: c# html-agility-pack

我想做的就是

node.Attributes["class"].Value

但是如果节点没有class属性,它就会崩溃。所以,我必须首先检查它的存在,对吗?我怎么做? Attributes不是一个dict(它是一个包含内部字典的列表?),并且没有HasAttribute方法(只是一个HasAttributes,它指示它是否有任何属性)。我该怎么办?

4 个答案:

答案 0 :(得分:15)

更新回答

如果缺少该属性,请使用node.Attributes["class"]?.Value返回null。这与下面的ValueOrDefault()相同。

原始回答

试试这个:

String val;
if(node.Attributes["class"] != null)
{
  val = node.Attributes["class"].Value;
}

或者您可以添加此

public static class HtmlAgilityExtender
{
    public static String ValueOrDefault(this HtmlAttribute attr)
    {
        return (attr != null) ? attr.Value : String.Empty;
    }
}

然后使用

node.Attributes["class"].ValueOrDefault();

我没有测试过那个,但它应该有效。

答案 1 :(得分:3)

请试试这个:

String abc = String.Empty;     
      if (tag.Attributes.Contains(@"type"))
      {
          abc = tag.Attributes[@"type"].Value;
      }

答案 2 :(得分:0)

此代码可用于获取两个脚本标记之间的所有文本。

String getURL(){
return @"some site address";
}
List<string> Internalscripts()
    {
        HtmlAgilityPack.HtmlDocument doc = new HtmlWeb().Load((@"" + getURL()));
        //Getting All the JavaScript in List
        HtmlNodeCollection javascripts = doc.DocumentNode.SelectNodes("//script");
        List<string> scriptTags = new List<string>();
        foreach (HtmlNode script in javascripts)
        {
            if(!script.Attributes.Contains(@"src"))
            {
                scriptTags.Add(script.InnerHtml);
            }
        }
        return scriptTags;
    }

答案 3 :(得分:0)

HTML Agility Pack具有检查节点是否具有特定类或提供所有类列表的功能。

    //Select nodes example, get all <p> tag nodes and check if they have a class and if they do, get the class attribute.
foreach (HtmlNode node in htmlAgilityDocument.DocumentNode.SelectNodes("//p"))
{
    if (node.HasClass("ClassName"))
    {
        HtmlAttribute classAttributes = node.Attributes["ClassName"];
        //Do something ...
    }
}

//Select nodes example, get all <p> tag nodes having a specified class name.
string className = "class";
foreach (HtmlNode node in htmlAgilityDocument.DocumentNode.SelectNodes("//p[@class='" + className + "']"))
{
    //Access via class attribute
    HtmlAttribute classAttribute = node.Attributes[className];
    //Do something ...
}

//Get all class names to check for a class
bool containsClass = htmlAgilityDocument.DocumentNode.GetClasses().Contains("ClassName");
if (containsClass == true)
{
    //Do something ...
}