Htmlagilitypack частично анализирует только строки таблицы - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь разобрать основной (последний в дереве dom)

<table>

на этом сайте: "https://aips.um.si/PredmetiBP5/Main.asp?Mode=prg&Zavod=77&Jezik=&Nac=1&Nivo=P&Prg=1571&Let=1" Я использую Htmlagilitypack и пишу код на C # в приложении wpf в visual studio 17.

Сейчас я использую этот код:

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> 

сам по себе, я также пытался использовать прямой селектор xpath, скопированный из firefox: "/ 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

1 Ответ

0 голосов
/ 12 мая 2018

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());
}

Но я не знаю, есть ли проблемы вСам стол.

...