Parsen von html mit dem HTML-Agility-Pack und Linq
Habe ich den folgenden HTML -
(..)
<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>
(..)
Informationen, die ich habe ist der name, der => also "Test1" & "Test2". Was ich wissen möchte ist, wie bekomme ich die Daten in "Daten" und "data2", basierend auf dem Namen ich habe.
Derzeit bin ich mit:
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;
Aber ich bekomme {"Object reference not set to an instance of an object."}
wenn ich versuche, um sich in data
Genau, was wollen Sie tun? Und was ist der code tut, dass Sie nicht wollen?
Hehe, sorry, ich habe vergessen hinzuzufügen, ich bin das hinzufügen es jetzt
Können Sie uns erklären, was Ihr Fehler ist? Oder das, was Sie erwarten zu geschehen, dass das nicht passiert?
Ich habe mich verändert meine Frage, hoffentlich, um es ein bisschen mehr Verständnis.
In deinem Beispiel den text in dein tds hat eine vorausgehende und nachfolgende Leerzeichen, in der Erwägung, dass die Zeichenfolge, die Sie suchen, nicht.
Hehe, sorry, ich habe vergessen hinzuzufügen, ich bin das hinzufügen es jetzt
Können Sie uns erklären, was Ihr Fehler ist? Oder das, was Sie erwarten zu geschehen, dass das nicht passiert?
Ich habe mich verändert meine Frage, hoffentlich, um es ein bisschen mehr Verständnis.
In deinem Beispiel den text in dein tds hat eine vorausgehende und nachfolgende Leerzeichen, in der Erwägung, dass die Zeichenfolge, die Sie suchen, nicht.
InformationsquelleAutor Timo Willemsen | 2011-01-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als für deinen Versuch, du hast zwei Probleme mit dem code:
ChildNodes
ist komisch - es gibt auch whitespace text nodes, die nicht über eineclass
Attribute (kann keine Attribute haben, natürlich).Mit diesen beiden Korrekturen, die folgenden Werke:
InformationsquelleAutor Kobi
Hier ist der XPATH-Weg - hmmm... jeder scheint vergessen zu haben, über die macht, XPATH und konzentrieren sich ausschließlich auf C# XLinq, in diesen Tagen 🙂
Diese Funktion holt alle Datenwerte in Verbindung mit einem Namen:
Zum Beispiel wird mit diesem code dump all 'Test2' Daten:
contains
, aber es gibt ein großes problem: die Suche nachTest1
finden auchTest10
,NotTest1
und so weiter. Ich weiß wirklich nicht, genug, xpath, um über das problem...Wenn Sie nicht verwenden möchten, enthält, dann können Sie =. Wenn Leerzeichen sind ein Problem, Sie können entfernt werden, mit normalize-space oder anderen link mehr info: stackoverflow.com/questions/1852571/...
Der Grund, warum ich lieber die Linq-Antwort über XPath ist, weil das letztere ist schwer zu Lesen und zu verstehen. Das erstere ist vollkommen klar, was beabsichtigt ist und, wenn notwendig, brechen Sie die query in subqueries zu Debuggen. XPath ist schwammig und unmöglich zu Debuggen. Es ist schwierig zu überprüfen, ob dies das richtige zu tun, ohne eine Menge von test-Daten. Einfach googeln für eine autorisierende Seite auf die XPath-syntax ist hasserfüllt lästige Pflicht. Ich Liebe immer noch HAP, aber jedes mal, wenn ich eine XPath-Anweisung, die ich erschaudern.
Alles ist schwer, wenn du es nicht weißt. Ich denke XPATH ist viel einfacher zu bedienen und zu verstehen, wie beim Abfragen einer XML festgelegt. Es behandelt auch null-Werte ordnungsgemäß (im Gegensatz zu Linq). Der einzige (große) Nachteil ist, es ist nicht cool für groß-und Kleinschreibung-Vergleich. Ein weiteres Problem ist XPATH ist nicht portabel (existiert nicht auf WinRT zum Beispiel). Sowieso, die die Bibliothek verwenden, die Sie bevorzugen 🙂
InformationsquelleAutor Simon Mourier
Hier ist ein Ansatz - zuerst analysieren alle Daten in einer Daten-Struktur, und dann Lesen Sie es. Dies ist ein wenig chaotisch und braucht sicherlich noch eine weitere überprüfung, aber hier geht:
Hier Wende ich mich jedes
<tr>
zu einem Wörterbuch, wo die Klasse der<td>
ist ein Schlüssel und der text ist ein Wert. Als Nächstes Wende ich mich der Liste der Wörterbücher, die in ein Wörterbuch der Wörterbücher (Tipp - abstrakte, entfernt), wo diename
jeder<tr>
ist der Schlüssel.InformationsquelleAutor Kobi
statt
versuchen
oder
InformationsquelleAutor Kurru
Kann ich empfehlen, gibt es zwei Möglichkeiten:
http://htmlagilitypack.codeplex.com/, wandelt die html-gültigen xml-Code kann dann abgefragt werden, gegen die mit OOTB Linq.
Oder,
Linq to HTML (http://www.superstarcoders.com/linq-to-html.aspx), die zwar nicht gepflegt auf CodePlex ( das war ein Tipp, Keith ), bietet eine angemessene Reihe von Funktionen zum Sprungbrett aus.
InformationsquelleAutor