【问题标题】:Htmlagilitypack only parses table rows partialyHtmlagilitypack 仅部分解析表行
【发布时间】:2018-10-22 15:38:07
【问题描述】:

我正在尝试解析 main(在 dom 树中的最后一个)

<table>

在本网站:“https://aips.um.si/PredmetiBP5/Main.asp?Mode=prg&Zavod=77&Jezik=&Nac=1&Nivo=P&Prg=1571&Let=1” 我在 Visual Studio 17 的 wpf 应用程序上使用 Htmlagilitypack 并用 C# 编写代码。

我现在正在使用这个代码:

iso = Encoding.GetEncoding("windows-1250");
web = new HtmlWeb()
{
    AutoDetectEncoding = false,
    OverrideEncoding = iso,
};
//http = https://aips.um.si/PredmetiBP5/Main.asp?Mode=prg&Zavod=77&Jezik=&Nac=1&Nivo=P&Prg=1571&Let=1
string http = formatLetnikLink(l.Attributes["onclick"].Value).ToString();           
var htmlProgDoc = web.Load(http);
string s = htmlProgDoc.ParsedText;

htmlprogDoc.ParsedText 正确包含所有行 应该在最后一个表中 (我有这个用于调试,以防监视窗口被打破或什么...... idk......)

我试图首先获取网站上的所有表格。并意识到有6个

<table></table>

标签上,即使你视觉上只看到一个。经过几个小时的调试,我意识到最后一个主表是最后一个

<table>

在dom树中,解析器完全解析所有的

<tr>

表具有的标签。这就是问题所在,我需要所有的 tr 标签。

var tables = htmlProgDoc.DocumentNode.SelectNodes("//table");

有6次

<table></table>

标签,正如预期的那样,他们每个人都被完全解析,包括他们所有的行和列,除了最后一个,在最后一个它只解析前两行,然后解析器会追加一个

 </table> 

就其本身而言,我也尝试使用从 firefox 复制的直接 xpath 选择器: “/html/body/div/center[2]/font/font/font/table”,而不是“//table” 找到了正确的表,但该表也只包含前 2 行

var theTableINeed = tables.Last();
//contains the correct table which I need, but with only the first two rows

【问题讨论】:

  • 您问题中的链接只指向一张桌子,而不是六张桌子,而且我们不会说斯洛文尼亚语。请编辑您的问题。不清楚你在问什么。你是说那张桌子吗? aips.um.si/PredmetiBP5/…
  • 在网站上有一个表(视觉上)但是如果你查看 dom 树,有 6 个带有 标签的元素,我指的是最后一个
    树,这是与其他网站的链接的主表。这是我需要解析的。很抱歉造成误解,如果仍然不清楚,请告诉我。
  • 因为这个 Html 格式错误,HtmlAgilityPack 会猜测缺少哪些标签,然后将新标签插入到文档中。不幸的是,这并不总是奏效。例如&lt;!-- stoplec interna izbirnost --&gt;&lt;td class="tdStandard"&gt;&lt;font class="Small"&gt;Izbirni&lt;/font&gt;&lt;/font&gt;&lt;/td&gt; 这里有一个额外的关闭字体标签。 Html 是废话。
  • 那么有没有办法让我获得完整的完整表格?我是 htmlagilitypack 的新手,有没有办法关闭标签插入?任何提示将不胜感激

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


【解决方案1】:

该页面上的 Html 格式不正确。一种可能的解决方法是剥离最后一个表的代码并将其解析为文档。

var client = new WebClient();
string html = client.DownloadString(url);
int lastTableOpen = html.LastIndexOf("<table");
int lastTableClose = html.LastIndexOf("</table");
string lastTable = html.Substring(lastTableOpen, lastTableClose - lastTableOpen + 8);

然后使用 HtmlAgilityPack:

var table = new HtmlDocument();
table.LoadHtml(lastTable);
foreach (var row in table.DocumentNode.SelectNodes("//table//tr"))
{
    Console.WriteLine(row.ToString());
}

但是不知道是不是表本身有问题。

【讨论】:

  • 非常感谢,通过一些小修改,这已经非常完美了。 :D
猜你喜欢
  • 1970-01-01
  • 2012-12-21
  • 2021-09-09
  • 2022-08-23
  • 2020-11-27
  • 2019-01-26
  • 2016-11-20
  • 2015-03-31
  • 1970-01-01
相关资源
最近更新 更多