All I want to do is
node.Attributes["class"].Value
但是如果节点没有
class
属性,它会崩溃。所以,我必须先检查它的存在,对吗?我该如何做呢?Attributes
不是一个字典(它是一个包含内部字典的列表??),也没有 HasAttribute 方法(只有一个 HasAttributes 方法,表示是否具有任何属性)。我该怎么办?All I want to do is
node.Attributes["class"].Value
class
属性,它会崩溃。所以,我必须先检查它的存在,对吗?我该如何做呢?Attributes
不是一个字典(它是一个包含内部字典的列表??),也没有 HasAttribute 方法(只有一个 HasAttributes 方法,表示是否具有任何属性)。我该怎么办?更新的答案
使用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();
我没有测试过那个,但它应该可以工作。
IfNotNull
扩展方法,它允许node.Attribute["class"].IfNotNull(x => x.Value)
。虽然不完全符合你的要求,但我经常用它来解决这种问题。 - Kirk WollGetAttributeValue
方法了...不需要再添加另一个。 - mpenString abc = String.Empty;
if (tag.Attributes.Contains(@"type"))
{
abc = tag.Attributes[@"type"].Value;
}
这段代码可以用来获取两个 script 标签之间的所有文本。
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;
}
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 ...
}
node.Attributes["class"]
是否返回 null 吗? - Kirk Woll