开发者

HtmlAgilityPack algorithm question

I’m using HtmlAgilityPack to obtain some Html from a web site.

Here is the received Html:

<table class="table">
<tr>
    <td>
        <table class="innertable">...</table>
    </td>
</tr>
<tr>
    <td colspan="2"><strong>Contact</strong></td>
</tr>
<tr>
    <td colspan="2">John Doe</td>
</tr>
<tr>
    <td colspan="2">Jane Doe</td>
</tr>
<tr>
    <td colspan="2">&nbsp;</td>
</tr>
<tr>
    <td><strong>Units</strong></td>
    <td>32</td>
</tr>
<tr>
    <td><strong>Year</strong></td>
    <td>1998</td>
</tr>
</table>

The Context:

I’m using the following code to get the first :

var table = document.DocumentNode.SelectNodes("//table[@class='table']").FirstOrDefault();

I’m using the following code to get the inner table :

var innerTable = table.SelectNodes("//table[@class=innertable]").FirstOrDefault();

So far so good!

I need to get some information from the first table and some from the inner table. Since I begin with the information from the fir开发者_运维技巧st table I need to skip the first row (which holds the inner table) so I do the following:

var tableCells = table.SelectNodes("tr[position() > 1]/td");

Since I now have all the cells from the first table excluding the inner table, I start doing the following:

string contact1 = HttpUtility.HtmlDecode(tableCells[1].InnerHtml);
string contact2 = HttpUtility.HtmlDecode(tableCells[2].InnerHtml);

string units = HttpUtility.HtmlDecode(tableCells[5].InnerHtml);
string years = HttpUtility.HtmlDecode(tableCells[7].InnerHtml);

The problem:

I’m getting the values I want by hardcoding the index in tableCells[] not thinking the layout would move…unfortunately, it does move.

In some cases I do not have a “Jane Doe” row (as shown in the above Html), this means I may or may not have two contacts.

Because of this, I can’t hardcode the indexes since I might end up having the wrong data in the wrong variables.

So I need to change my approach...

Does anyone know how I could perfect my algorithm so that it can take into account the fact that I may have one or two contacts and perhaps not use hardcoded indexes?

Thanks in advance!

vlince


There is never one unique solution to this kind of problem. Here is an XPATH that seems to do some kind of it though:

        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc.Load(yourHtmlFile);

        doc.Save(Console.Out);

        foreach (HtmlNode node in doc.DocumentNode.SelectNodes("//tr[td/strong/text() = 'Contact']/following-sibling::tr/td/text()[. != '&nbsp;']"))
        {
            Console.WriteLine(node.OuterHtml);
        }

will display this:

John Doe
Jane Doe
32
1998
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜