【问题标题】:HtmlAgilityPack extracts text from all divs in a page and not just from the one div specified in the codeHtmlAgilityPack 从页面中的所有 div 中提取文本,而不仅仅是从代码中指定的一个 div
【发布时间】:2012-06-18 21:25:50
【问题描述】:

我在使用 HtmlAgilityPack 的 xpath 表达式时遇到了奇怪的行为。 我正在尝试使用 HtmlAgilityPack 来提取声明为的 div 中的所有值 <div class='cont'> 但是,当我使用下面的代码时,我只需获取其中的所有值 <div class='cont'><div class='button'>。有谁知道为什么会这样? 这是重现它的完整代码:

using System;
using System.Xml.XPath;
using HtmlAgilityPack;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            const string text1 = @"<div class=""cont"">
<h3>content</h3> 
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content1</div><div style=""margin: 0cm 0cm 0pt"" class=""Normal""> content2</div>
<div style=""margin: 0cm 0cm 0pt"" class=""Normal"">content3 </div>
<div>content4 </div><strong>content5
<div>content6 </div><ul type=""disc"">    
<div>content7 </div>        
<div>content8 </div>    </ul>
<p class='margin10'><font size=""2"">
<div>
<p><span style=""font-family: Arial"">content9</span></p>
</div>
<div>content10</font><a href=""mailto:james@polis.com""><u><font color=""#0000ff"" size=""2""><font color=""#0000ff"" size=""2""> content11 </u></font></font></a><font size=""2""> content12
<div>content13</div>
</div>
</font>
</p>
</div>
<div class=""button"">
<span class=""applybtn""><a class=""buttonGlobal buttonAlpha"" href=""/uk/job/apply/(id)/608735"">content14</a></span>
</div>";
            foreach (XPathNavigator node in SearchInPage(text1, "//div[@class='cont']"))
            {
                Console.WriteLine("option " + node.Value);
            }

        }

        private static XPathNodeIterator SearchInPage(string text, string xpath)
        {
            HtmlDocument htmlDocument = new HtmlDocument();
            htmlDocument.LoadHtml(text);
            XPathNavigator xpathNavigator = htmlDocument.CreateNavigator();
            XPathNodeIterator nodes = xpathNavigator.Select(xpath);
            return nodes;
        }
    }
}

代码返回: 'content', 'content1-13' PLUS 'content14' 存在于&lt;div class='button'&gt;

【问题讨论】:

  • 您必须使用损坏的 Html 敏捷包。我的版本 1.3.0.0 只返回一个节点,它是带有 'cont' 类的主 'div'。
  • @SimonMourier - 我使用的是 1.4.0 版稳定版。我下载并重新安装了 htmlagilitypack.dll 但仍然有同样的问题。如果我从 html 代码中删除 (紧跟在

    之后的那个),那么代码可以正常工作。即 HAP 仅返回

    内的值

标签: c# html-agility-pack


【解决方案1】:

所以如果我理解正确,您只想找到节点 &lt;div class="cont"&gt; 的子节点的值吗?

试试这个:

HtmlDocument doc = new HtmlDocument;
doc.Load(Html);
HtmlNode node = doc.DocumentNode.SelectSingleNode(".//div[@class='cont']");

foreach(HtmlNode childNode in node)
{
    Console.WriteLine(childNode.Value);
}

我没有办法在我面前进行调试,但这应该可以。 (".//div[@class='cont']") 应该只选择指定节点及其子节点,并忽略指定节点之外的任何内容。剩下的只是 Linq 和 HtmlAgilityPack - 请记住,HtmlAgilityPack 实现了 XPath,因此请确保在使用 XPath 之前查看 AgilityPacks 可用的方法......请记住,xml 和 html 是不同的语言,适用于一个的不一定适用于其他。

【讨论】:

  • @gffppaste 我运行以下命令:HtmlDocument doc = new HtmlDocument();doc.Load(new StringReader(text1));HtmlNode node = doc.DocumentNode.SelectSingleNode(".//div[@class='cont']");Console.WriteLine(node.InnerText); //使用字符串阅读器,因为我收到“路径中的非法字符”错误。应用程序仍然从两个节点返回文本(
    )。我在同一个网站的 50 个页面上测试了我的代码(我的问题附带的代码),并为其中的 48 个页面工作。 'text1'(见问题)包含代码失败的那 2 个页面中的 1 个的 html。
猜你喜欢
  • 2013-09-02
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
相关资源
最近更新 更多