HTML Agility Pack не работает должным образом - PullRequest
1 голос
/ 02 марта 2012

Я пытаюсь проанализировать эту HTML-страницу здесь с помощью пакета Agility Pack HTML, но я не могу заставить ее работать должным образом.

Это моя страница (сокращенная):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="de-ch" xml:lang="de-ch">
<head>
</head>
<body id="Adressservices">
    <div id="page">
        <div id="page-544">
            <table class="full">
                <thead>
                    <tr>
                        <th class="first" scope="col" style="width: 18%;">Type</th>
                        <th class="col" style="width: 20%;">Name</th>
                        <th class="col">Date</th>
                        <th class="col" style="text-align: right; width: 10%;">Size</th>
                    </tr>
                </thead>
                <tbody>
                    <tr>
                        <td class="first">Change</td>
                        <td><a href="/download?file=5210044">somefile01.zip</a></td>
                        <td style="width: 5%;"><b class="filesize">2012-03-01</b></td>
                        <td style="text-align: right;"><b class="filesize">881.00</b></td>
                    </tr>
                    <tr>
                        <td class="first">Change</td>
                        <td><a href="/download?file=7610042">somefile02.zip</a></td>
                        <td style="width: 5%;"><b class="filesize">2012-02-01</b></td>
                        <td style="text-align: right;"><b class="filesize">1400.00</b></td>
                    </tr>
                    <tr>.....</tr>
                </tbody>
            </table>
        </div>
    </div>
</body>
</html>

На настоящей странице есть еще несколько <tr>....</tr> строк в этой таблице.

Мне удалось прекрасно загрузить страницу с помощью HTML Agility Pack, используя этот фрагмент кода:

HtmlWeb web = new HtmlWeb();
HtmlDocument archiveDoc = web.Load(_archiveUrl);
var tables = archiveDoc.DocumentNode.SelectNodes("//table");

Таким образом, я получаю дескриптор моего элемента <table>, он работает просто отлично.

Теперь я пытался получить элемент first <tr> из этой таблицы, и я попробовал это:

HtmlNode node = tables[0];
var allTRNodes = node.SelectNodes("tbody/tr");
var firstTR = allTRNodes[0];

Здесь я не получаю n <tr> узлов, как ожидалось, - только два.И первый из них не содержит списка y дочерних узлов типа <td> либо ...

Затем я попробовал Linq-to- "HTML":

HtmlNode node = tables[0];
var firstTR = node.Element("tbody").Element("tr");

но опять же: я не получаю первый <tr> узел, содержащий список y дочерних узлов типа <td>, либо ...

Пытаюсь получить список всех <td> узлов внутри первого<tr> также не работает должным образом:

HtmlNode node = tables[0];
var allTDNodes = node.SelectNodes("tbody/tr/td");
var firstTD = allTDNodes[0];

вместо ожидаемых узлов y <td>, я получаю только три дочерних узла - два из #text, последнийтипа <td> - почему ??

Похоже, HTML Agility Pack неправильно интерпретирует список <td> узлов как вложенные узлы ......

Есть идеи?Мысли?Советы, как это решить?

1 Ответ

2 голосов
/ 02 марта 2012

использовать потомка, как в этом примере:

var linkNode = doc.DocumentNode.SelectSingle("//div[@id=\"content-wrapper\"]/dl/dd");
var hrefNode = linkNode.SelectSingleNode("descendant::a");

Что-то, что я не согласен с пакетом HtmlAgility для этого узла. Выбор узла * вызывает обход dom сверху, а не с текущего узла .

Вот пример для вашего случая

// table 
var tableNode = docNode.SelectSingleNode("//table"); 
// first tr
var trNode = tableNode.SelectSingleNode("descendant::tr"); 

// you can also try, but it's overkill
var trNode1 = tableNode.SelectSingleNode("descendant::tr[0]"); 

// then your td
var tdNode = trNode.SelectSingleNode("descendant::td"); 
...