我想做的就是
node.Attributes["class"].Value
但是如果节点没有class
属性,它就会崩溃。所以,我必须首先检查它的存在,对吗?我怎么做? Attributes
不是一个dict(它是一个包含内部字典的列表?),并且没有HasAttribute方法(只是一个HasAttributes,它指示它是否有任何属性)。我该怎么办?
答案 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 ...
}