HTMLAgilityPack: debe establecer la propiedad UseIdAttribute en true para habilitar esta característica

c# html-agility-pack

Pregunta

Estoy tratando de usar HTMLAgilityPack con VS2008 / .Net 3.5. Recibo este error incluso si configuro el OptionUseIdAttribute como verdadero, aunque se supone que es verdadero de manera predeterminada.

Error Message:
 You need to set UseIdAttribute property to true to enable this feature

Stack Trace:
    at HtmlAgilityPack.HtmlDocument.GetElementbyId(String id)

Probé las versiones 1.4.6 y 1.4.0, ninguna funcionó.

Versión 1.4.6 - Net20 / HtmlAgilityPack.dll

Versión 1.4.0 - Net20 / HtmlAgilityPack.dll

Este es el código,

    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = web.Load(url);
    HtmlNode table = doc.GetElementbyId("tblThreads");

Esto tampoco funcionó,

    HtmlWeb web = new HtmlWeb();
    HtmlDocument doc = new HtmlDocument { OptionUseIdAttribute = true };
    doc = web.Load(url);
    HtmlNode table = doc.GetElementbyId("tblThreads");

¿Cómo puedo solucionar este problema? Gracias.

Respuesta aceptada

Primero usé ILSpy en el 1.4.0 HAP Dll. Navegué a la clase HtmlDocument y pude ver que el método GetElementById se ve así:

// 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;
}

Luego hice que ILSpy analizara "_nodesid", porque en su caso, por alguna razón, no se está configurando. "HtmlDocument.DetectEncoding (TextReader)" y "HtmlDocument.Load (TextReader)" asigna valor a "_nodesid".

Por lo tanto, podría probar un método alternativo para leer el contenido de la URL mediante el cual el valor "_nodesid" se asignará definitivamente, por ejemplo

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");

Este enfoque garantiza que se llame "HtmlDocument.Load (TextReader)", y en ese código puedo ver que _nodesid definitivamente se asignará, por lo que este enfoque puede (no he compilado el código que sugerí) que funcione.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow