HtmlAgilityPack WebGet.Load dà errore "Riferimento oggetto non impostato su un'istanza di un oggetto"

c# html-agility-pack

Domanda

Sono a un progetto su come ottenere nuovi prezzi per le auto dai siti dei rivenditori. Posso recuperare la maggior parte dei siti web in html. Ma quando provo a caricare uno di essi, il metodo WebGet.Load (url) fornisce il Object reference not set to an instance of an object. errore. Non sono riuscito a trovare alcuna differenza tra questi siti web.

Esempi di URL di lavoro normali:

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

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

problema del sito Web:

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

Grazie per l'aiuto.

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

Quando uso questo documento url non è caricato.

Risposta popolare

Il problema reale si trova negli interni di HtmlAgilityPack. La pagina non funzionante ha questo tipo di contenuto meta: <META http-equiv="Content-Type" content="text/html; charset=8859-9"> dove charset=8859-9 sembra essere incorrente. Gli interni HAL cercano di ottenere una codifica appropriata per questa stringa utilizzando qualcosa come Encoding.GetEncoding("8859-9") e questo genera un errore (penso che la codifica effettiva dovrebbe essere iso-8859-9 ).

In realtà tutto ciò che serve è dire a HAL di non leggere la codifica per HtmlDocument (solo HtmlDocument.OptionReadEncoding = true ), ma questo sembra impossibile con HtmlWeb.Load (l'impostazione di HtmlWeb.AutoDetectEncoding non funziona qui). Quindi, la soluzione potrebbe essere in una lettura manuale dell'URL (il modo più semplice):

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

Funziona e analizza correttamente la pagina.

EDIT: @: Simon Mourier: sì, solleva NullReferenceException perché cattura ArgumentException e imposta _declaredencoding = null lì. E quindi la riga _declaredencoding.WindowsCodePage genera il riferimento null.

ecco un blocco di codice dal metodo HtmlDocument.cs, ReadDocumentEncoding :

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

Ed ecco la mia traccia dello stack:

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



Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché