【问题标题】:HTML Agility Pack - Issue selecting an HTML select tag with the option tags withinHTML Agility Pack - 选择带有选项标签的 HTML 选择标签的问题
【发布时间】:2013-07-30 13:16:17
【问题描述】:

我正在使用 HTML Agility Pack 选择一个元素并从加载的 html 字符串中返回该元素及其包含的所有内容。在测试我的代码时,我针对 w3schools 中的选择标记示例运行它:

<select name="cars">
  <option value="volvo">Volvo XC90</option>
  <option value="saab">Saab 95</option>
  <option value="mercedes">Mercedes SLK</option>
  <option value="audi">Audi TT</option>
</select>

当我尝试使用 HTML 敏捷包选择并返回它时,我得到(删除了选项结束标签):

<select name="cars">
  <option value="volvo">Volvo XC90
  <option value="saab">Saab 95
  <option value="mercedes">Mercedes SLK
  <option value="audi">Audi TT
</select>

所以我在这里进行了一些搜索,并找到了添加该行的说明: HtmlNode.ElementsFlags.Remove("option");

我这样做了,现在我得到了(选项文本被移到选项标签之外):

<select name="cars">
  <option value="volvo"></option>Volvo XC90
  <option value="saab"></option>Saab 95
  <option value="mercedes"></option>Mercedes SLK
  <option value="audi"></option>Audi TT
</select>

我希望输出与原始 HTML 相匹配。我需要做什么才能获得它?

我也在使用 OptionWriteEmptyNodes,因为当我使用输入标签进行测试时,它们的自关闭被删除了,添加该选项似乎可以解决这个问题。我现在将其注释掉以确保它不会影响此问题。

这是我的 .NET C# 代码:

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(content);
HtmlNode.ElementsFlags.Remove("option"); // otherwise, the closing tag is removed.

//doc.OptionWriteEmptyNodes = true;

var nodes = doc.DocumentNode.SelectNodes("//select");

if (nodes == null)
    return "Not found";
else
    return nodes[0].OuterHtml;

【问题讨论】:

  • 在您的第一个示例 HTML 代码中,您的
  • 对不起,没有意识到原来的例子在不同的地方是不同的。我使用我的 html 文件阅读了它。很抱歉造成混乱。

标签: c# .net dom html-agility-pack


【解决方案1】:

您需要为选项标签设置 ElementsFlag 字段才能使其工作

HtmlNode.ElementsFlags["option"] = HtmlElementFlag.Closed;

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(html);

它应该返回您的原始 HTML 代码。

我相信 HtmlAgilityPack 之所以会出现这种行为是因为 &lt;option&gt;-tag 讽刺地是 HTML 中的一个可选标签,不需要结束标签。

取自HtmlNode类的文档,它的字段ElementsFlags

获取定义特定行为的标志集合 元素节点。该表包含一个 DictionaryEntry 列表,其中包含 小写的标签名称作为 Key,和 HtmlElementFlags 的组合 作为价值。

进一步查看HtmlElementFlag 枚举会发现:

空 - 节点为空。 META 或 IMG 是此类节点的示例。 Closed - 解析时会自动关闭节点。

您可以查看HtmlNode 类的源代码,了解哪些其他标签被视为“特定”。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-13
  • 2014-05-17
  • 1970-01-01
  • 1970-01-01
  • 2011-07-08
  • 2011-09-05
  • 2011-06-11
相关资源
最近更新 更多