HtmlAgilityPack读取嵌套html中的问题

时间:2015-01-05 08:41:13

标签: c# html-agility-pack

我遇到使用HtmlAgilityPack读取嵌套HTML节点的问题。 我想读取div标签内的所有字体节点,并希望处理所有p标签。

我的逻辑: 我选择了所有p标签,现在使用foreach循环处理它。然后我从当前项目中选择第一个节点。

问题: 但它接下来就是从html的根目录中选择第一个节点。

我想: 有没有办法从当前项目(节点)中选择标签?

我正在使用这样的HTML代码

 <font>State</font>
<div>
    <p>
        <font>text1</font>
        <a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
    </p>
    <p>
        <font>text2</font>
        <a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
    </p>
    <p>
        <font>text3</font>
        <a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
    </p>
    <p>
        <font>text4</font>
        <a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
    </p>
    <p>
        <font>text5</font>
        <a href="mailto:rabbi@chabadofalabama.com" target="mainFrame">EMAIL</a>
    </p>

</div>

我的C#阅读代码是:

Console.WriteLine("Enter A Url :");
        var ur = Console.ReadLine();
        HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(new Uri(ur));
        request.Method = WebRequestMethods.Http.Get;
        request.Proxy.Credentials = System.Net.CredentialCache.DefaultCredentials;
        request.UserAgent = "Foo";
        request.Accept = "*/*";
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        StreamReader reader = new StreamReader(response.GetResponseStream());
        string responseString = reader.ReadToEnd();
        response.Close();
        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(responseString);
        var topLevelItems = doc.DocumentNode.Descendants().Where(n => n.Name.ToLower() == "p").ToList();

        foreach (var item in topLevelItems)
        {
            var v = item.SelectSingleNode("//font[1]");
            if(v!=null)
            {
                Console.WriteLine("Results : "+v.InnerText);
            }
        }

提前致谢

1 个答案:

答案 0 :(得分:1)

问题在于,由于//,您在每个循环中搜索整个文档数据,因此foreach似乎“无法正常工作”

替换为

var v = item.SelectSingleNode(".//font[1]");

现在它应该仅检查item循环

foreach变量内的数据