C# 使用C从某个内部获取所有元素

C# 使用C从某个内部获取所有元素,c#,html-parsing,C#,Html Parsing,我有一个由几个元素组成的网页 我想写一个程序,在一个特定的头之后打印一个文件中的所有li元素。谁能给我一些帮助或示例代码 标题 这就是我想要的 当涉及到用C解析HTML时,不要试图编写自己的。几乎可以肯定的是,你可以做你想做的事 哪些部分是常数: DIV中的“id”是什么? h4 搜索一个完整的HTML文档并单独对H4作出反应可能会很混乱,但是如果你知道DIV有内容ID,那么就去寻找它吧 var doc = new HtmlAgilityPack.HtmlDocument(); doc.Load

我有一个由几个元素组成的网页

我想写一个程序,在一个特定的头之后打印一个文件中的所有li元素。谁能给我一些帮助或示例代码

标题 这就是我想要的
当涉及到用C解析HTML时,不要试图编写自己的。几乎可以肯定的是,你可以做你想做的事

哪些部分是常数:

DIV中的“id”是什么? h4 搜索一个完整的HTML文档并单独对H4作出反应可能会很混乱,但是如果你知道DIV有内容ID,那么就去寻找它吧

var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(yourHtml);

if ( doc.DocumentNode != null )
{
   var divs = doc.DocumentNode
                 .SelectNodes("//div")
                 .Where(e => e.Descendants().Any(e => e.Name == "h4"));

   // You now have all of the divs with an 'h4' inside of it.

   // The rest of the element structure, if constant needs to be examined to get
   // the rest of the content you're after.
}

如果是网页,为什么需要进行HTML解析。您正在使用的构建网页的技术是否能够访问网页的所有元素。例如,如果您使用的是ASP.NET,您可以将id分配给UL和LIwith runat server标记,它们将在代码隐藏中可用

你能解释一下你想做什么吗?如果您试图发出web请求,请将html作为字符串下载,然后废弃html是有意义的

编辑 我认为这应该有效

HtmlDocument doc = new HtmlDocument();
doc.Load(myHtmlFile);

    foreach (HtmlNode p in doc.DocumentNode.SelectNodes("//div"))
    {
        if(p.Attributes["id"].Value == "content")
        {
            foreach(HtmlNode child in p.ChildNodes.SelectNodes("//ul"))
            {
                if(p.PreviousSibling.InnerText() == "Header")
                {
                    foreach(HtmlNode liNodes in p.ChildNodes)
                    {
                        //liNodes represent all childNode
                    }
                }
        }
    }

如果您想要的只是位于标签下面所有标签之间的东西,并且正好位于标签之后,那么这就足够了:

//Load your document first.
//Load() accepts a Stream, a TextReader, or a string path to the file on your computer
//If the entire document is loaded into a string, then use .LoadHtml() instead.
HtmlDocument mainDoc = new HtmlDocument();
mainDoc.Load("c:\foobar.html");


//Select all the <li> nodes that are inside of an element with the id of "content"
// and come directly after an <h4> tag.
HtmlNodeCollection processMe = mainDoc.GetElementbyId("content")
                                      .SelectNodes("//h4/following-sibling::*[1]//li");

//Iterate through each <li> node and print the inner text to the console
foreach (HtmlNode listElement in processMe)
{
    Console.WriteLine(listElement.InnerText);
}

毫无意义。不过,我会打错。应该是我有html敏捷包,但是你能给我一些示例代码来做我需要的事情吗,因为我以前的尝试失败了。一般来说,对html解析和编码非常陌生。向我们展示您以前的尝试,我相信有人会指出哪里出了问题。我正在使用WebClient从一个网站获取源代码,然后我需要解析我需要的特定内容,但我真的不知道如何正确使用html Agility Pack。谢谢您答复我收到以下错误:错误1“HtmlAgilityPack.HtmlNode”不包含“attribute”的定义,并且找不到接受类型为“HtmlAgilityPack.HtmlNode”的第一个参数的扩展方法“attribute”?是否缺少using指令或程序集引用?我在.load函数上收到错误。使用以下代码maindoc.loadwebclient.downloadstringURL。加载是否可以将输入作为字符串使用?您必须使用.LoadHtml而不是.load来解析字符串。在.Load中使用字符串告诉它要在您的计算机上打开哪个文件,如c:\mywebpage.html。让我编辑一下我的答案,解释一下这一点,并调整SelectNodes中的XPath字符串。您是谁构建了这个字符串的://h4/下面的同级::*[1]//li我离得越来越近了,但这并不是我真正需要的,但我学到了很多。感谢您的回复。您可以从文章中找到您可能需要的大部分内容。//h4/后面的同级::/*[1]//li说的是,//h4:获取元素,/后面的同级::/*[1]:获取该元素后面的第一个同级,在您的示例中,//li:获取前一个元素下的任意位置。我知道这让人困惑,但这是我能解释的最简单的方法,不需要太多细节: