如何在html敏捷包的帮助下从html文件中提取最里面的表?

时间:2010-03-31 04:34:23

标签: c# .net winforms xpath html-agility-pack

我在html敏捷包的帮助下解析html文件中的表格信息。

现在我可以做到并且有效。

但是当我想要提取的表格最内部时。

或者我不知道它在嵌套表中的哪个位置。并且可以有任意数量的嵌套表,并且我想从中提取具有列名称,地址的表的信息。

实施例。

<table>
    <table>
           <tr><td>PHONE NO.</td><td>OTHER INFO.</td></tr>
           <tr><td>
              <table>
                 <tr><td>AMOUNT</td></tr>
                 <tr><td>50000</td></tr>
                 <tr><td>80000</td></tr>
              </table>
           </td></tr>
           <tr><td>
              <table>
                 <tr><td>
                     <table>
                         <tr><td>
                              <table>
                                 <tr><td> NAME </td><td>ADDRESS</td>
                                 <tr><td> ABC  </td><td> kfks   </td>
                                 <tr><td> BCD  </td><td> fdsa   </td>
                              </table>
                         </tr></td>
                     </table>
                 </td></tr>
              </table>
           </td></tr>
        </table>

有很多表,但我想提取具有列名称,地址的表。 所以我该怎么做 ?

2 个答案:

答案 0 :(得分:2)

将文档加载为HtmlDocument。然后使用XPath查询查找不包含其他表的表,并在第一行中包含“名称”的td。

XPath实现是来自System.Xml.XPath的标准.NET实现,因此任何有关将XPath与XmlDocument一起使用的文档都将适用。

HtmlDocument doc = new HtmlDocument();
doc.Load("file.html");
HtmlNode el = (HtmlNode) doc.DocumentNode.SelectSingleNode("//table[not(descendant::table) and tr[1]/td['NAME' = normalize-space()]]");

如果“名称”列已修复,您可以使用'Name' = normalize-space(tr[1]/td[2])

之类的内容

根据多个列名查找表,但不是最内层的表条件。

HtmlNode el = (HtmlNode) doc.DocumentNode.SelectSingleNode("//table[tr[1]/td['NAME' = normalize-space()] and tr[1]/td['ADDRESS' = normalize-space()]]");

答案 1 :(得分:0)

var table = doc.DocumentNode.SelectSingleNode("//table [not(descendant::table) and tr[1]/td[normalize-space()='ADDRESS'] ]");