Ich versuche, HTMLAgilityPack mit VS2008 / .Net 3.5 zu verwenden. Ich erhalte diesen Fehler, selbst wenn ich das OptionUseIdAttribute auf true setze, obwohl es standardmäßig als true gelten soll.
Error Message:
You need to set UseIdAttribute property to true to enable this feature
Stack Trace:
at HtmlAgilityPack.HtmlDocument.GetElementbyId(String id)
Ich habe Version 1.4.6 und 1.4.0 ausprobiert, beides hat nicht funktioniert.
Version 1.4.6 - Net20 / HtmlAgilityPack.dll
Version 1.4.0 - Net20 / HtmlAgilityPack.dll
Das ist der Code,
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = web.Load(url);
HtmlNode table = doc.GetElementbyId("tblThreads");
Das hat auch nicht funktioniert,
HtmlWeb web = new HtmlWeb();
HtmlDocument doc = new HtmlDocument { OptionUseIdAttribute = true };
doc = web.Load(url);
HtmlNode table = doc.GetElementbyId("tblThreads");
Wie kann ich dieses Problem beheben? Vielen Dank.
Zuerst habe ich ILSpy auf der 1.4.0 HAP Dll verwendet. Ich navigierte zur HtmlDocument-Klasse und konnte sehen, dass die GetElementById-Methode folgendermaßen aussieht:
// HtmlAgilityPack.HtmlDocument
/// <summary>
/// Gets the HTML node with the specified 'id' attribute value.
/// </summary>
/// <param name="id">The attribute id to match. May not be null.</param>
/// <returns>The HTML node with the matching id or null if not found.</returns>
public HtmlNode GetElementbyId(string id)
{
if (id == null)
{
throw new ArgumentNullException("id");
}
if (this._nodesid == null)
{
throw new Exception(HtmlDocument.HtmlExceptionUseIdAttributeFalse);
}
return this._nodesid[id.ToLower()] as HtmlNode;
}
Ich habe ILSpy dann dazu gebracht, "_nodesid" zu analysieren, denn in Ihrem Fall wird es aus irgendeinem Grund nicht gesetzt. "HtmlDocument.DetectEncoding (TextReader)" und "HtmlDocument.Load (TextReader)" weist "_nodesid" einen Wert zu.
Sie könnten also eine alternative Methode zum Lesen des Inhalts aus der URL verwenden, wobei der Wert "_nodesid" eindeutig zugewiesen wird, z
var doc = new HtmlDocument();
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (var response = (HttpWebResponse)request.GetResponse())
{
using (var stream = response.GetResponseStream())
{
doc.Load(stream);
}
}
var table = doc.GetElementbyId("tblThreads");
Dieser Ansatz stellt sicher , dass „HtmlDocument.Load (Textreader)“ genannt wird , und in diesem Code kann ich das _nodesid sehen wird auf jeden Fall zugewiesen bekommen, so kann dieser Ansatz (ich habe nicht den Code kompiliert ich vorgeschlagen habe) Arbeit.