Im folgenden HTML kann ich das table
analysieren, aber ich weiß nicht, wie man die th
Elemente überspringt.
Ich möchte nur die td
Elemente erhalten, aber wenn ich versuche zu verwenden:
foreach (HtmlNode cell in row.SelectNodes("td"))
... Ich bekomme eine Ausnahme.
<table class="tab03">
<tbody>
<tr>
<th class="right" rowspan="2">first</th>
</tr>
<tr>
<th class="right">lp</th>
<th class="right">name</th>
</tr>
<tr>
<td class="right">1</td>
<td class="left">house</td>
</tr>
<tr>
<th class="right" rowspan="2">Second</th>
</tr>
<tr>
<td class="right">2</td>
<td class="left">door</td>
</tr>
</tbody>
</table>
Mein Code:
var document = doc.DocumentNode.SelectNodes("//table");
string store = "";
if (document != null)
{
foreach (HtmlNode table in document)
{
if (table != null)
{
foreach (HtmlNode row in table.SelectNodes("tr"))
{
store = "";
foreach (HtmlNode cell in row.SelectNodes("th|td"))
{
store = store + cell.InnerText+"|";
}
sw.Write(store );
sw.WriteLine();
}
}
}
}
sw.Flush();
sw.Close();
Diese Methode verwendet LINQ zum Abfragen von HtmlNode
Instanzen mit dem Namen td
.
Ich bemerkte auch, dass Ihre Ausgabe als val|val|
angezeigt wird (mit der string.Join(pipe, array)
Pipe), Dieses Beispiel verwendet string.Join(pipe, array)
als eine weniger abscheuliche Methode zum Entfernen der folgenden Pipe: val|val
.
using System.Linq;
// ...
var tablecollection = doc.DocumentNode.SelectNodes("//table");
string store = string.Empty;
if (tablecollection != null)
{
foreach (HtmlNode table in tablecollection)
{
// For all rows with at least one child with the 'td' tag.
foreach (HtmlNode row in table.DescendantNodes()
.Where(desc =>
desc.Name.Equals("tr", StringComparison.OrdinalIgnoreCase) &&
desc.DescendantNodes().Any(child => child.Name.Equals("td",
StringComparison.OrdinalIgnoreCase))))
{
// Combine the child 'td' elements into an array, join with the pipe
// to create the output in 'val|val|val' format.
store = string.Join("|", row.DescendantNodes().Where(desc =>
desc.Name.Equals("td", StringComparison.OrdinalIgnoreCase))
.Select(desc => desc.InnerText));
// You can probably get rid of the 'store' variable as it's
// no longer necessary to store the value of the table's
// cells over the iteration.
sw.Write(store);
sw.WriteLine();
}
}
}
sw.Flush();
sw.Close();
Ihre XPath-Syntax ist nicht korrekt. Bitte versuche:
HtmlNode cell in row.SelectNodes("//td")
Dadurch erhalten Sie die Sammlung von td
Elementen, die mit foreach
iteriert werden können.