HtmlAgilityPack WebGet.Load donne l'erreur "Référence d'objet non définie à une instance d'objet"

c# html-agility-pack

Question

Je suis sur un projet visant à obtenir les prix des voitures neuves à partir des sites Web des concessionnaires. Je peux aller chercher la plupart des sites Web html. Mais lorsque j'essaie de charger l'un d'entre eux, la méthode WebGet.Load (url) donne Object reference not set to an instance of an object. Erreur. Je n'ai trouvé aucune différence entre ces sites Web.

Exemples d'URL de travail normales:

http://www.renault.com.tr/page.aspx?id=1715

http://www.hyundai.com.tr/tr/Content.aspx?id=fiyatlistesi

site problématique

http://www.fiat.com.tr/Pages/tr/otomobiller/grandepunto_fiyat.aspx

Merci de votre aide.

var webGet = new HtmlWeb();  
var document = webGet.Load("http://www.fiat.com.tr/Pages/tr/otomobiller/grandepunto_fiyat.aspx");

Lorsque j'utilise ce document, l'URL n'est pas chargé.

Réponse populaire

Le problème actuel réside dans les composants internes de HtmlAgilityPack. La page qui ne fonctionne pas a ce type de contenu méta: <META http-equiv="Content-Type" content="text/html; charset=8859-9">charset=8859-9 semble être incorrect. Les composants internes de HAL essaient d’obtenir un encodage approprié pour cette chaîne en utilisant quelque chose comme Encoding.GetEncoding("8859-9") , ce qui génère une erreur (je pense que l’encodage réel devrait être iso-8859-9 ).

En fait, tout ce dont vous avez besoin est de dire à HAL de ne pas lire l'encodage pour HtmlDocument ( HtmlDocument.OptionReadEncoding = true ), mais cela semble impossible avec HtmlWeb.Load (définir HtmlWeb.AutoDetectEncoding ne fonctionne pas ici). La solution de contournement pourrait donc consister en une lecture manuelle de l'URL (la manière la plus simple):

var document = new HtmlDocument();
document.OptionReadEncoding = false;

var url = 
   new Uri("http://www.fiat.com.tr/Pages/tr/otomobiller/grandepunto_fiyat.aspx");
var request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
using (var response = (HttpWebResponse)request.GetResponse())
{
    using (var stream = response.GetResponseStream())
    {
        document.Load(stream, Encoding.GetEncoding("iso-8859-9"));
    }
}

Cela fonctionne et analyse avec succès la page.

EDIT: @: Simon Mourier: oui, il lève NullReferenceException car il NullReferenceException ArgumentException et y fixe _declaredencoding = null . Et ensuite, la ligne _declaredencoding.WindowsCodePage lève la référence null.

Voici un bloc de code de la méthode HtmlDocument.cs, ReadDocumentEncoding :

try
{
    _declaredencoding = Encoding.GetEncoding(charset);
}
catch (ArgumentException)
{
    _declaredencoding = null;
}
if (_onlyDetectEncoding)
{
    throw new EncodingFoundException(_declaredencoding);
}

if (_streamencoding != null)
{
    if (_declaredencoding.WindowsCodePage != _streamencoding.WindowsCodePage)
    {
        AddError(
            HtmlParseErrorCode.CharsetMismatch,
            _line, _lineposition,
            _index, node.OuterHtml,
            "Encoding mismatch between StreamEncoding: " +
            _streamencoding.WebName + " and DeclaredEncoding: " +
            _declaredencoding.WebName);
    }
}

Et voici ma trace de pile:

System.NullReferenceException was unhandled
  Message=Object reference not set to an instance of an object.
  Source=HtmlAgilityPack
  StackTrace:
       at HtmlAgilityPack.HtmlDocument.ReadDocumentEncoding(HtmlNode node) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 1916
       at HtmlAgilityPack.HtmlDocument.PushNodeEnd(Int32 index, Boolean close) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 1805
       at HtmlAgilityPack.HtmlDocument.Parse() in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 1468
       at HtmlAgilityPack.HtmlDocument.Load(TextReader reader) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 769
       at HtmlAgilityPack.HtmlDocument.Load(Stream stream, Boolean detectEncodingFromByteOrderMarks) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlDocument.cs:line 597
       at HtmlAgilityPack.HtmlWeb.Get(Uri uri, String method, String path, HtmlDocument doc, IWebProxy proxy, ICredentials creds) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1515
       at HtmlAgilityPack.HtmlWeb.LoadUrl(Uri uri, String method, WebProxy proxy, NetworkCredential creds) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1563
       at HtmlAgilityPack.HtmlWeb.Load(String url, String method) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1152
       at HtmlAgilityPack.HtmlWeb.Load(String url) in C:\Source\htmlagilitypack\Trunk\HtmlAgilityPack\HtmlWeb.cs:line 1107
       at test.console.Program.Main(String[] args) in W:\Projects\Me\test.console\test.console\Program.cs:line 54
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi