Wenn ich also versuche, ein HTML-Dokument mit Html Agility Pack zu analysieren. Ich lade das HTML-Dokument und es funktioniert. Das Problem liegt, wenn ich versuche, es mit XPath zu analysieren. Ich bekomme eine "System.NullReferenceException: 'Objektreferenz nicht auf eine Instanz eines Objekts gesetzt.'" Fehler.
Um meinen xpath zu erhalten, benutze ich das Chrome-Entwicklungsfenster und markiere die gesamte Tabelle mit den Zeilen, die die Daten enthalten, die ich analysieren möchte, klicke mit der rechten Maustaste darauf und kopiere Xpath.
Hier ist mein Code
string url = "https://www.ctbiglist.com/index.asp";
string myPara = "LastName=Smith&FirstName=James&PropertyID=&Submit=Search+Properties";
string htmlResult;
// Get the raw HTML from the website
using (WebClient client = new WebClient())
{
client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
// Send in the link along with the FirstName, LastName, and Submit POST request
htmlResult = client.UploadString(url, myPara);
//Console.WriteLine(htmlResult);
}
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlResult);
HtmlNodeCollection table = doc.DocumentNode.SelectNodes("//*[@id=\"Table2\"]/tbody/tr[2]/td/table/tbody/tr/td/div[2]/table/tbody/tr[2]/td/table/tbody/tr[2]/td/form/div/table[1]/tbody/tr");
Console.WriteLine(table.Count);
Wenn ich diesen Code ausführe funktioniert es aber greift alle Tabellen im HTML-Dokument.
var query = from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
from row in table.SelectNodes("//tr").Cast<HtmlNode>()
from cell in row.SelectNodes("//th|td").Cast<HtmlNode>()
select new { Table = table.Id, CellText = cell.InnerText };
foreach (var cell in query)
{
Console.WriteLine("{0}: {1}", cell.Table, cell.CellText);
}
Was ich will, ist eine bestimmte Tabelle, die alle Tabellenzeilen enthält, die die Daten haben, die ich in Objekte analysieren möchte.
Danke für die Hilfe!!!
Ändern Sie die Zeile
from table in doc.DocumentNode.SelectNodes("//table").Cast<HtmlNode>()
zu
from table in doc.DocumentNode.SelectNodes("//table[@id=\"Table2\"]").Cast<HtmlNode()
Dadurch wird nur eine bestimmte Tabelle mit der angegebenen ID ausgewählt. Wenn Sie jedoch Tabellen verschachtelt haben, müssen Sie Ihren xpath entsprechend ändern, um die geschachtelten Tabellenzeilen zu erhalten.