Я пытаюсь использовать 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 определенно будет назначен, поэтому этот подход может (я не компилировал предложенный мной код).