htmlagilitypack文本节点的父节点是选择而不是选项?

时间:2014-07-22 11:17:46

标签: html-agility-pack

使用htmlagility,我正在搜索由select组成的dom结构中的文本节点。

<select>
  <option>
    one
  </option>
  <option>
    two
  </option>
</select>

那些节点父母似乎是

<select>

而不是

<option>

为什么?

using System.IO;
using System.Linq;
using HtmlAgilityPack;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace Foo.Test
{
  [TestClass]
  public class HtmlAgilityTest
  {
    [TestMethod]
    public void TestTraverseTextNodesInSelect()
    {
      var html = "<select><option>one</option><option>two</option></select>";

      var doc = new HtmlDocument();
      doc.Load(new StringReader(html));

      var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text");

      Assert.AreEqual(2, elements.Count());
      Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name);
      Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name);
    }
  }
}

2 个答案:

答案 0 :(得分:2)

   [TestMethod]
    public void TestTraverseTextNodesInSelect()
    {
      HtmlNode.ElementsFlags.Remove("option");
      var html = "<select><option>one</option><option>two</option></select>";

      var doc = new HtmlDocument();
      doc.Load(new StringReader(html));

      var elements = doc.DocumentNode.Descendants().Where(n=>n.Name == "#text");

      Assert.AreEqual(2, elements.Count());
      Assert.AreEqual("select", elements.ElementAt(0).ParentNode.Name);
      Assert.AreEqual("select", elements.ElementAt(1).ParentNode.Name);
    }

你可以试试这个。

在图书馆里,它有这样的感觉。你需要删除它。默认情况下,AgilityPack设置为将选项标记视为空。

ElementsFlags.Add("option", HtmlElementFlag.Empty);

答案 1 :(得分:1)

那是因为HtmlAgilityPack drop closing <option> tag by default。 HAP会看到您的HTML:

Console.WriteLine(doc.DocumentNode.OuterHtml);
//result :
//<select><option>one<option>two</select>

正如上面链接问题所述,您可以在启动HtmlDocument之前调用以下行来改变该行为:

HtmlNode.ElementsFlags.Remove("option");