Analyser html avec le HTML Agility Pack et Linq
J'ai le code HTML suivant
(..)
<tbody>
<tr>
<td class="name"> Test1 </td>
<td class="data"> Data </td>
<td class="data2"> Data 2 </td>
</tr>
<tr>
<td class="name"> Test2 </td>
<td class="data"> Data2 </td>
<td class="data2"> Data 2 </td>
</tr>
</tbody>
(..)
L'information que j'ai est le nom => ainsi, "Test1" & "Test2". Ce que je veux savoir, c'est comment puis-je obtenir les données qui existent dans "données" et "data2", basé sur le Nom que j'ai.
Actuellement, je suis en utilisant:
var data =
from
tr in doc.DocumentNode.Descendants("tr")
from
td in tr.ChildNodes.Where(x => x.Attributes["class"].Value == "name")
where
td.InnerText == "Test1"
select tr;
Mais je reçois {"Object reference not set to an instance of an object."}
quand j'ai essayer de regarder dans data
source d'informationauteur Timo Willemsen
Vous devez vous connecter pour publier un commentaire.
Comme pour votre tentative, vous avez deux problèmes avec votre code:
ChildNodes
est bizarre, il renvoie également les espaces les nœuds de texte, qui ne disposent pas d'unclass
attributs (ne peut pas avoir des attributs, bien sûr).Avec ces deux corrections, les ouvrages suivants:
Ici est le chemin XPATH - hmmm... tout le monde semble avoir oublié la puissance de XPATH et de se concentrer exclusivement sur C# XLinq, ces jours 🙂
Cette fonction récupère toutes les valeurs de données associées à un nom:
Par exemple, ce code dump tous 'Test2' data:
Voici une approche - d'abord analyser toutes les données dans une structure de données, puis de les lire. C'est un peu désordonné et certainement besoin de plus de validation, mais va ici:
Ici je tourne tous les
<tr>
à un dictionnaire, où la classe de l'<td>
est une clé et le texte est une valeur. Ensuite, je tourne la liste des dictionnaires dans un dictionnaire de dictionnaires (pointe - résumé à l'écart), où laname
de chaque<tr>
est la clé.au lieu de
essayer
ou
Je peux recommander l'une des deux façons suivantes:
http://htmlagilitypack.codeplex.com/qui convertit le code html xml valide, qui peut ensuite être interrogé contre avec OOTB Linq.
Ou,
Linq to HTML (http://www.superstarcoders.com/linq-to-html.aspx), qui, tout en n'est pas maintenue sur CodePlex ( qui était une allusion, Keith ), donne un travail raisonnables de tremplin.