HtmlAgilityPack - Saisir des données à partir d'une table html

c# html html-agility-pack screen-scraping

Question

Mon programme utilise HtmlAgilityPack et saisit une page Web HTML, la stocke dans une variable et j'essaie d'obtenir du HTML deux tables qui sont sous des balises spécifiques à la classe Div (boardcontainer). Avec mon code actuel, il parcourt toutes les pages de la page Web et les affiche, mais lorsqu'une cellule est vide, une exception est générée:

"NullReferenceException n'était pas gérée - La référence à un objet n'est pas définie pour une instance d'objet.".

Un extrait du code HTML (dans ce cas, je cherche "Microsoft" sur le site:

<div class="boardcontainer">
<table cellpadding="4" cellspacing="1" border="0" width="100%">
<tr><td colspan="6" class="catbg" height="18" >Main Database</td></tr>
<tr>
    <td class="windowbg" width="28%" align="center">Company Name</td>
    <td class="windowbg" width="12%" align="center">0870 / 0871</td>
    <td class="windowbg" width="12%" align="center">0844 / 0845</td>
    <td class="windowbg" width="12%" align="center">01 / 02 / 03</td>
    <td class="windowbg" width="12%" align="center">Freephone</td>
    <td class="windowbg" width="24%" align="center">Other Information</td>
</tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�01954 713950</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Customer Support</b><br><i>Straight to agent (no menu)</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0118 909 7800</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Main UK Switchboard</b><br><i>Ask to be put through to required department</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>

Ceci est mon code actuel qui ne saisit que les tables et affiche les lignes + cellules puis lève une exception sur Null.

<div class="boardcontainer">
<table cellpadding="4" cellspacing="1" border="0" width="100%">
<tr><td colspan="6" class="catbg" height="18" >Main Database</td></tr>
<tr>
    <td class="windowbg" width="28%" align="center">Company Name</td>
    <td class="windowbg" width="12%" align="center">0870 / 0871</td>
    <td class="windowbg" width="12%" align="center">0844 / 0845</td>
    <td class="windowbg" width="12%" align="center">01 / 02 / 03</td>
    <td class="windowbg" width="12%" align="center">Freephone</td>
    <td class="windowbg" width="24%" align="center">Other Information</td>
</tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�01954 713950</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Customer Support</b><br><i>Straight to agent (no menu)</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0118 909 7800</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Main UK Switchboard</b><br><i>Ask to be put through to required department</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>

Comment puis-je changer cela pour rechercher la classe div spécifique et extraire la table de l'intérieur?

Merci pour la lecture.

HTML COMPLET:

<div class="boardcontainer">
<table cellpadding="4" cellspacing="1" border="0" width="100%">
<tr><td colspan="6" class="catbg" height="18" >Main Database</td></tr>
<tr>
    <td class="windowbg" width="28%" align="center">Company Name</td>
    <td class="windowbg" width="12%" align="center">0870 / 0871</td>
    <td class="windowbg" width="12%" align="center">0844 / 0845</td>
    <td class="windowbg" width="12%" align="center">01 / 02 / 03</td>
    <td class="windowbg" width="12%" align="center">Freephone</td>
    <td class="windowbg" width="24%" align="center">Other Information</td>
</tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�01954 713950</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Customer Support</b><br><i>Straight to agent (no menu)</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>
<td class=windowbg2 width=28% align=center BGCOLOR=#FFFFCC><a href=http://www.websitename.com/exit.php?site=www.microsoft.co.uk target="_blank">Microsoft</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0870 601 0100</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0844 800 2400</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�0118 909 7800</a></td><td class=windowbg2 width=12% align=center BGCOLOR=#FFFFCC>�</a></td><td class=windowbg2 width=24% align=center BGCOLOR=#FFFFCC>�<b>Main UK Switchboard</b><br><i>Ask to be put through to required department</i><br><font size=1>Also for 0870 6010200</font></td></tr>
    <tr>

Réponse acceptée

Le XPATH suivant vous permet de rechercher un DIV spécifique (avec la classe 'boardcontainer') dans votre document HTML:

//div[@class='boardcontainer']/table

Pour gérer les lignes vides, vérifiez simplement si HtmlNodeCollection renvoyé est null .

Voici un exemple complet:

//div[@class='boardcontainer']/table

Vous devez également vérifier si une table est trouvée et si la table trouvée contient des lignes.


Réponse populaire

Essayer:

foreach (HtmlNode table in 
         htmlDoc.DocumentNode.SelectNodes("//div[@class='boardcontainer']/table"))

C'est une expression XPath correspondant à l'attribut. Voir ici pour plus d'informations:

http://www.exampledepot.com/egs/org.w3c.dom/xpath_getelembyattr.html




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi