HTMLAgilityPack - вам необходимо установить свойство UseIdAttribute в true, чтобы включить эту функцию

c# html-agility-pack

Вопрос

Я пытаюсь использовать HTMLAgilityPack с VS2008 / .Net 3.5. Я получаю эту ошибку, даже если я устанавливаю для параметра OptionUseIdAttribute значение true, хотя по умолчанию он должен быть истинным.

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

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

Я пробовал версии 1.4.6 и 1.4.0, не работал.

Версия 1.4.6 - Net20 / HtmlAgilityPack.dll

Версия 1.4.0 - Net20 / HtmlAgilityPack.dll

Это код,

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

Это тоже не сработало,

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

Как я могу исправить эту проблему? Благодарю.

Принятый ответ

Сначала я использовал ILSpy в 1.4.0 HAP Dll. Я перешел в класс HtmlDocument и увидел, что метод GetElementById выглядит так:

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

Затем я получил ILSpy для анализа «_nodesid», потому что в вашем случае по какой-то причине он не устанавливается. «HtmlDocument.DetectEncoding (TextReader)» и «HtmlDocument.Load (TextReader)» присваивает значение «_nodesid».

Следовательно, вы можете попробовать альтернативный метод для чтения содержимого из URL-адреса, где значение «_nodesid» будет определенно присвоено, например

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

Этот подход гарантирует, что вызывается «HtmlDocument.Load (TextReader)», и в этом коде я вижу, что _nodesid определенно будет назначен, поэтому этот подход может (я не компилировал предложенный мной код).



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow