C#htmlagilitypack node.xpath

C#htmlagilitypack node.xpath,c#,html,xpath,html-agility-pack,C#,Html,Xpath,Html Agility Pack,我正在用C#和htmlagilitypack制作一个webscraper应用程序,现在我想用下拉菜单来选择文档中的一个元素。我想看到xpath的字符串,这是我希望得到的结果 //a[@href=”http://www.google.com“] 但是我得到的xpath是 /html[1]/body[1]/div[1]/a[1] 有什么方法可以恢复更可读的xpath吗? 我使用的代码是: HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(data

我正在用C#和htmlagilitypack制作一个webscraper应用程序,现在我想用下拉菜单来选择文档中的一个元素。我想看到xpath的字符串,这是我希望得到的结果

//a[@href=”http://www.google.com“]

但是我得到的xpath是

/html[1]/body[1]/div[1]/a[1]

有什么方法可以恢复更可读的xpath吗? 我使用的代码是:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(data);
List<string> nodes = new List<string>();
foreach (HtmlNode n in doc.DocumentNode.Descendants()){
        nodes.Add(n.XPath);
}
List<string> ComboItems = nodes.Distinct().ToList();
_comboFilterNode.ItemsSource = ComboItems;
HtmlDocument doc=新的HtmlDocument();
doc.LoadHtml(数据);
列表节点=新列表();
foreach(doc.DocumentNode.subjects()中的HtmlNode n){
Add(n.XPath);
}
List ComboItems=nodes.Distinct().ToList();
_comboFilterNode.ItemsSource=ComboItems;
它不必是我给出的第一个示例的格式,但我确实需要一些东西,这样您就不需要阅读整个HTML文件来了解它是什么元素

或者一种获得:

<a href="http://www.google.com/"/>

它并不总是一个
,我也不想要innerHTML


提前感谢您的帮助:D

您可以使用
HtmlNode
名称和属性集合的组合为给定的
HtmlNode
构建HTML标记,排除其内容

例如,假设变量
foo
引用了
HtmlNode
实例,可以执行以下操作:

HtmlNode foo;

var attributes = string.Join(" ", 
                             foo.Attributes
                                .Select(o => String.Format("{0}=\"{1}\"", o.Name, o.Value))
                            );

//combine element name and the attributes collection to create a representative HTML markup
var result = String.Format("<{0} {1}/>", foo.Name, attributes);
我现在有:

foreach (HtmlNode n in doc.DocumentNode.Descendants())
{
        if (n.Attributes.Count != 0)
        {
              nodes.Add("//"+n.Name + "[@" + n.Attributes[0].Name+"='"+n.Attributes[0].Value+"']");
         }
         else
         {
               nodes.Add(n.Name);
          }
  }

  List<string> ComboItems = nodes.Distinct().ToList();
  _comboFilterNode.ItemsSource = ComboItems;
foreach(doc.DocumentNode.subjects()中的HtmlNode n)
{
如果(n.Attributes.Count!=0)
{
节点。添加(“//”+n.Name+“[@”+n.Attributes[0]。Name+“=”“+n.Attributes[0]。Value+“]”);
}
其他的
{
nodes.Add(n.Name);
}
}
List ComboItems=nodes.Distinct().ToList();
_comboFilterNode.ItemsSource=ComboItems;

遗憾的是,我现在只有一个属性可以过滤它,但它可以满足需要,并在XPath中返回。

“…我不想要innerHTML”,innerHTML的问题是什么?(我会这样做,而不是试图获取给定元素的不同XPath,这将使构建更加复杂)如果我得到innerHTML,我也会得到所有子元素,我不希望这样
<a href="http://www.google.com/"/>
foreach (HtmlNode n in doc.DocumentNode.Descendants())
{
        if (n.Attributes.Count != 0)
        {
              nodes.Add("//"+n.Name + "[@" + n.Attributes[0].Name+"='"+n.Attributes[0].Value+"']");
         }
         else
         {
               nodes.Add(n.Name);
          }
  }

  List<string> ComboItems = nodes.Distinct().ToList();
  _comboFilterNode.ItemsSource = ComboItems;