【问题标题】:Load HtmlDocument from html with specific symbols (<, >)使用特定符号(<、>)从 html 加载 HtmlDocument
【发布时间】:2012-10-10 19:02:38
【问题描述】:

我正在创建 HtmlDocument 并使用 LoadHtml(string)。我的输入 html 字符串有时会在其中包含符号 &amp;lt;&gt;。所以html解析不正确,例如:

我的 html 是
&lt;p&gt;Value &lt; 20 A B C&lt;/p&gt;

在这种情况下,我的文档 OutputHtml 是
&lt;p&gt;Value &lt; 20="" a="" b=""&gt;&lt;/p&gt;

也许我必须在 HtmlDocument 中设置一些标志,但我没有发现任何有用的东西。

P.S. HtmlNode 具有相同的行为。

【问题讨论】:

  • 您是否可以修复 HTML? &amp;lt; 应该是 &amp;lt;。我知道 HTML 比 XML 更宽松,但我认为这基本上仍然是无效的 HTML。 (仅仅因为它在浏览器中呈现并不能使它有效......)
  • 我从第三方来源获取 html 字符串。也许我可以用有效代码替换这个字符串中的&amp;lt;&gt;符号,然后调用函数,但是不替换标签怎么办?
  • 听起来您想先在其上运行 HtmlTidy - 请参阅 tidy.sourceforge.net(或类似的东西。)
  • 是的。这是 HAP 中的一个错误。不太可能是一个设置,因为这种行为总是错误的。 HtmlTidy 看起来是你最好的选择。
  • @SimonMourier - HTML5 规范详细说明了如何解析无效的 HTML。事实上,它足以涵盖任何字节序列。在这种情况下,它被tag open state of the tokenizer (anything else case) 覆盖,它表示如果&amp;lt; 后面的字符是空格,则尖括号只是一个小于号,而不是标签的开头。

标签: c# html parsing xpath html-agility-pack


【解决方案1】:

解决问题最好的方法是在&amp;lt中更改字符&lt;(字符&gt;无需更改)

要知道字符&lt;什么时候是标签,什么时候'小于'你可以问if 代码如下:

public static string CreateCorrectHtmlDoc(string htmlDoc)
        {
            int i = 0;
            List<int> index = new List<int>();
            try
            {
                //look for '<' 
                while ((i = htmlDoc.IndexOf("<", i)) != -1)
                {
                    i += 1;
                    //regex to find '<' that is no tag
                    if (Regex.IsMatch(htmlDoc[i].ToString(), "\\d|-") || Regex.IsMatch(htmlDoc[i].ToString(), "[^a-zA-Z!]") && Regex.IsMatch(htmlDoc[i + 1].ToString(), "\\d\\s|-|\\d"))
                    {
                        htmlDoc = htmlDoc.Substring(0, i - 1) + "&lt" + htmlDoc.Substring(i + 1);
                    }
                }
            }
            catch
            {
                Log.Insert("Error: CreateCorrectHtmlDoc");
                return "";
            }
            return htmlDoc;
        }

我正在使用它,它工作得很好

【讨论】:

  • @ChruS,您可以更改正则表达式:instesd \\d put \\s\\d,我更改了代码
  • 是的,这很好用!但是如果 &lt;20 没有空格怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
相关资源
最近更新 更多