繁体   English   中英

HTML Agility Pack - 选择带有选项标签的HTML选择标记的问题

[英]HTML Agility Pack - Issue selecting an HTML select tag with the option tags within

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

<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;

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

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

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

应返回原始HTML代码。

我认为HtmlAgilityPack以这种方式运行的原因是因为<option> -tag具有讽刺意味的是HTML中的可选标记,不需要结束标记。

摘自HtmlNode类的文档及其字段ElementsFlags

获取标志的集合,这些标志定义特定元素节点的特定行为。 该表包含一个DictionaryEntry列表,其中小写标记名称为Key,HtmlElementFlags组合为Value。

进一步查看HtmlElementFlag枚举显示:

空 - 节点为空。 META或IMG是此类节点的示例。 已关闭 - 解析期间将自动关闭节点。

您可以查看类HtmlNode的源代码,以查看其他标记被视为“特定”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM