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é.
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">
où 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: