Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
La fonction de cache est vraiment un ajout de dernière minute à la librarie.
Elle n'est donc ni 100% finie, ni 100% fiable. Ceci étant dit, on peut
corriger le premier problème en modifiant le code de HtmlWeb.cs a deux
endroits
1) Remplacer le code de GetCachePath(Uri) par
public string GetCachePath(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!UsingCache)
{
throw new HtmlWebException("Cache is not enabled. Set UsingCache to true
first.");
}
string cachePath = Path.Combine(_cachePath, (uri.Host + "" + uri.Port +
uri.AbsolutePath).Replace('/', ''));
if (uri.AbsolutePath.EndsWith("/"))
{
cachePath = Path.Combine(cachePath, ".htm");
}
if (uri.Query.Length > 1)
{
cachePath += "" + uri.Query.Substring(1);
}
return cachePath;
}
2) Remplacer le code de LoadUrl(Uri, string) par
private HtmlDocument LoadUrl(Uri uri, string method)
{
HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionFixNestedTags = true;
_statusCode = Get(uri, method, null, doc);
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
}
return doc;
}
Concernant l'encodage des pages HTML, c'est toujours une histoire compliquée
en WEB. L'encoding d'une page HTML envoyé par un flux HTTP se détermine de
plusieurs manières
1) le contenu de la page peut l'indiquer dans une balise méta du genrce:
<META http-equiv="Content-Type" content="text/html; charset=utf-8" >
2) théoriquement, le contenu du méta HTML ci dessus doit se trouver aussi
dans le stream HTTP, dans le header Content-Type
3) on peut aussi le trouver avec header HTTP Content-Encoding
4) enfin, on peut se baser sur le byte order mark (ou BOM), qui peut (ou
pas) se trouver au tout début du fichier (cf doc/google sur le sujet)
Bref, c'est théoriquement très compliqué :-) En pratique, si vous avez un
exemple précis, je peux jeter un coup d'oil
Sur la question des InnerText, il faut récupérer tous les nouds de type
commentaire et les supprimer
Simon.
www.softfluent.com
"wmn" a écrit dans le message de news:
451d7336$0$21144$Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
La fonction de cache est vraiment un ajout de dernière minute à la librarie.
Elle n'est donc ni 100% finie, ni 100% fiable. Ceci étant dit, on peut
corriger le premier problème en modifiant le code de HtmlWeb.cs a deux
endroits
1) Remplacer le code de GetCachePath(Uri) par
public string GetCachePath(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!UsingCache)
{
throw new HtmlWebException("Cache is not enabled. Set UsingCache to true
first.");
}
string cachePath = Path.Combine(_cachePath, (uri.Host + "\" + uri.Port +
uri.AbsolutePath).Replace('/', '\'));
if (uri.AbsolutePath.EndsWith("/"))
{
cachePath = Path.Combine(cachePath, ".htm");
}
if (uri.Query.Length > 1)
{
cachePath += "\" + uri.Query.Substring(1);
}
return cachePath;
}
2) Remplacer le code de LoadUrl(Uri, string) par
private HtmlDocument LoadUrl(Uri uri, string method)
{
HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionFixNestedTags = true;
_statusCode = Get(uri, method, null, doc);
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
}
return doc;
}
Concernant l'encodage des pages HTML, c'est toujours une histoire compliquée
en WEB. L'encoding d'une page HTML envoyé par un flux HTTP se détermine de
plusieurs manières
1) le contenu de la page peut l'indiquer dans une balise méta du genrce:
<META http-equiv="Content-Type" content="text/html; charset=utf-8" >
2) théoriquement, le contenu du méta HTML ci dessus doit se trouver aussi
dans le stream HTTP, dans le header Content-Type
3) on peut aussi le trouver avec header HTTP Content-Encoding
4) enfin, on peut se baser sur le byte order mark (ou BOM), qui peut (ou
pas) se trouver au tout début du fichier (cf doc/google sur le sujet)
Bref, c'est théoriquement très compliqué :-) En pratique, si vous avez un
exemple précis, je peux jeter un coup d'oil
Sur la question des InnerText, il faut récupérer tous les nouds de type
commentaire et les supprimer
Simon.
www.softfluent.com
"wmn" <wmn@nulpar.org> a écrit dans le message de news:
451d7336$0$21144$7a628cd7@news.club-internet.fr...
Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
La fonction de cache est vraiment un ajout de dernière minute à la librarie.
Elle n'est donc ni 100% finie, ni 100% fiable. Ceci étant dit, on peut
corriger le premier problème en modifiant le code de HtmlWeb.cs a deux
endroits
1) Remplacer le code de GetCachePath(Uri) par
public string GetCachePath(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!UsingCache)
{
throw new HtmlWebException("Cache is not enabled. Set UsingCache to true
first.");
}
string cachePath = Path.Combine(_cachePath, (uri.Host + "" + uri.Port +
uri.AbsolutePath).Replace('/', ''));
if (uri.AbsolutePath.EndsWith("/"))
{
cachePath = Path.Combine(cachePath, ".htm");
}
if (uri.Query.Length > 1)
{
cachePath += "" + uri.Query.Substring(1);
}
return cachePath;
}
2) Remplacer le code de LoadUrl(Uri, string) par
private HtmlDocument LoadUrl(Uri uri, string method)
{
HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionFixNestedTags = true;
_statusCode = Get(uri, method, null, doc);
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
}
return doc;
}
Concernant l'encodage des pages HTML, c'est toujours une histoire compliquée
en WEB. L'encoding d'une page HTML envoyé par un flux HTTP se détermine de
plusieurs manières
1) le contenu de la page peut l'indiquer dans une balise méta du genrce:
<META http-equiv="Content-Type" content="text/html; charset=utf-8" >
2) théoriquement, le contenu du méta HTML ci dessus doit se trouver aussi
dans le stream HTTP, dans le header Content-Type
3) on peut aussi le trouver avec header HTTP Content-Encoding
4) enfin, on peut se baser sur le byte order mark (ou BOM), qui peut (ou
pas) se trouver au tout début du fichier (cf doc/google sur le sujet)
Bref, c'est théoriquement très compliqué :-) En pratique, si vous avez un
exemple précis, je peux jeter un coup d'oil
Sur la question des InnerText, il faut récupérer tous les nouds de type
commentaire et les supprimer
Simon.
www.softfluent.com
"wmn" a écrit dans le message de news:
451d7336$0$21144$Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
Bonjour,
merci à Simon pour le support, le problème que j'avais soulevé n'est plus.
il semble néanmoins qu'il subsiste quelques imperfections
1. htmlWeb.FromCache
lorsqu'on utilise la fonction de cache (i-e htmlWeb.UsingCache = true;)
le flag htmlWeb.FromCache reste à false
dans la méthode LoadUrl, ne faut-il pas ajouter une ligne "_fromCache =
true;",
comme suit,
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
_fromCache = true;
}
2. Encodage html
voici un exemple qui semble mettre en évidence le problème. Si on se passe
de la fonction de cache (i-e htmlWeb.UsingCache = false;), la sortie des
caractères accentués n'est pas correcte. Par contre, avec le cache (i-e
htmlWeb.UsingCache = true;), même vidé, la sortie devient correcte.
class Test
{
static void Main(string[] args)
{
string url;
url =
"http://www.tendre-calin.com/nappe-rectangulaire-enduit-dessin-place-mangalore-bouton-d-or-p-123.html";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerText);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
encore une fois merci pour ce package qui rend d'immenses services.
Merci d'avance,
WMN
Simon Mourier [SoftFluent] a écrit :La fonction de cache est vraiment un ajout de dernière minute à la
librarie. Elle n'est donc ni 100% finie, ni 100% fiable. Ceci étant dit,
on peut corriger le premier problème en modifiant le code de HtmlWeb.cs a
deux endroits
1) Remplacer le code de GetCachePath(Uri) par
public string GetCachePath(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!UsingCache)
{
throw new HtmlWebException("Cache is not enabled. Set UsingCache to
true first.");
}
string cachePath = Path.Combine(_cachePath, (uri.Host + "" +
uri.Port + uri.AbsolutePath).Replace('/', ''));
if (uri.AbsolutePath.EndsWith("/"))
{
cachePath = Path.Combine(cachePath, ".htm");
}
if (uri.Query.Length > 1)
{
cachePath += "" + uri.Query.Substring(1);
}
return cachePath;
}
2) Remplacer le code de LoadUrl(Uri, string) par
private HtmlDocument LoadUrl(Uri uri, string method)
{
HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionFixNestedTags = true;
_statusCode = Get(uri, method, null, doc);
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
}
return doc;
}
Concernant l'encodage des pages HTML, c'est toujours une histoire
compliquée en WEB. L'encoding d'une page HTML envoyé par un flux HTTP se
détermine de plusieurs manières
1) le contenu de la page peut l'indiquer dans une balise méta du genrce:
<META http-equiv="Content-Type" content="text/html; charset=utf-8" >
2) théoriquement, le contenu du méta HTML ci dessus doit se trouver aussi
dans le stream HTTP, dans le header Content-Type
3) on peut aussi le trouver avec header HTTP Content-Encoding
4) enfin, on peut se baser sur le byte order mark (ou BOM), qui peut (ou
pas) se trouver au tout début du fichier (cf doc/google sur le sujet)
Bref, c'est théoriquement très compliqué :-) En pratique, si vous avez un
exemple précis, je peux jeter un coup d'oil
Sur la question des InnerText, il faut récupérer tous les nouds de type
commentaire et les supprimer
Simon.
www.softfluent.com
"wmn" a écrit dans le message de news:
451d7336$0$21144$Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
Bonjour,
merci à Simon pour le support, le problème que j'avais soulevé n'est plus.
il semble néanmoins qu'il subsiste quelques imperfections
1. htmlWeb.FromCache
lorsqu'on utilise la fonction de cache (i-e htmlWeb.UsingCache = true;)
le flag htmlWeb.FromCache reste à false
dans la méthode LoadUrl, ne faut-il pas ajouter une ligne "_fromCache =
true;",
comme suit,
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
_fromCache = true;
}
2. Encodage html
voici un exemple qui semble mettre en évidence le problème. Si on se passe
de la fonction de cache (i-e htmlWeb.UsingCache = false;), la sortie des
caractères accentués n'est pas correcte. Par contre, avec le cache (i-e
htmlWeb.UsingCache = true;), même vidé, la sortie devient correcte.
class Test
{
static void Main(string[] args)
{
string url;
url =
"http://www.tendre-calin.com/nappe-rectangulaire-enduit-dessin-place-mangalore-bouton-d-or-p-123.html";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerText);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
encore une fois merci pour ce package qui rend d'immenses services.
Merci d'avance,
WMN
Simon Mourier [SoftFluent] a écrit :
La fonction de cache est vraiment un ajout de dernière minute à la
librarie. Elle n'est donc ni 100% finie, ni 100% fiable. Ceci étant dit,
on peut corriger le premier problème en modifiant le code de HtmlWeb.cs a
deux endroits
1) Remplacer le code de GetCachePath(Uri) par
public string GetCachePath(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!UsingCache)
{
throw new HtmlWebException("Cache is not enabled. Set UsingCache to
true first.");
}
string cachePath = Path.Combine(_cachePath, (uri.Host + "\" +
uri.Port + uri.AbsolutePath).Replace('/', '\'));
if (uri.AbsolutePath.EndsWith("/"))
{
cachePath = Path.Combine(cachePath, ".htm");
}
if (uri.Query.Length > 1)
{
cachePath += "\" + uri.Query.Substring(1);
}
return cachePath;
}
2) Remplacer le code de LoadUrl(Uri, string) par
private HtmlDocument LoadUrl(Uri uri, string method)
{
HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionFixNestedTags = true;
_statusCode = Get(uri, method, null, doc);
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
}
return doc;
}
Concernant l'encodage des pages HTML, c'est toujours une histoire
compliquée en WEB. L'encoding d'une page HTML envoyé par un flux HTTP se
détermine de plusieurs manières
1) le contenu de la page peut l'indiquer dans une balise méta du genrce:
<META http-equiv="Content-Type" content="text/html; charset=utf-8" >
2) théoriquement, le contenu du méta HTML ci dessus doit se trouver aussi
dans le stream HTTP, dans le header Content-Type
3) on peut aussi le trouver avec header HTTP Content-Encoding
4) enfin, on peut se baser sur le byte order mark (ou BOM), qui peut (ou
pas) se trouver au tout début du fichier (cf doc/google sur le sujet)
Bref, c'est théoriquement très compliqué :-) En pratique, si vous avez un
exemple précis, je peux jeter un coup d'oil
Sur la question des InnerText, il faut récupérer tous les nouds de type
commentaire et les supprimer
Simon.
www.softfluent.com
"wmn" <wmn@nulpar.org> a écrit dans le message de news:
451d7336$0$21144$7a628cd7@news.club-internet.fr...
Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
Bonjour,
merci à Simon pour le support, le problème que j'avais soulevé n'est plus.
il semble néanmoins qu'il subsiste quelques imperfections
1. htmlWeb.FromCache
lorsqu'on utilise la fonction de cache (i-e htmlWeb.UsingCache = true;)
le flag htmlWeb.FromCache reste à false
dans la méthode LoadUrl, ne faut-il pas ajouter une ligne "_fromCache =
true;",
comme suit,
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
_fromCache = true;
}
2. Encodage html
voici un exemple qui semble mettre en évidence le problème. Si on se passe
de la fonction de cache (i-e htmlWeb.UsingCache = false;), la sortie des
caractères accentués n'est pas correcte. Par contre, avec le cache (i-e
htmlWeb.UsingCache = true;), même vidé, la sortie devient correcte.
class Test
{
static void Main(string[] args)
{
string url;
url =
"http://www.tendre-calin.com/nappe-rectangulaire-enduit-dessin-place-mangalore-bouton-d-or-p-123.html";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerText);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
}
}
encore une fois merci pour ce package qui rend d'immenses services.
Merci d'avance,
WMN
Simon Mourier [SoftFluent] a écrit :La fonction de cache est vraiment un ajout de dernière minute à la
librarie. Elle n'est donc ni 100% finie, ni 100% fiable. Ceci étant dit,
on peut corriger le premier problème en modifiant le code de HtmlWeb.cs a
deux endroits
1) Remplacer le code de GetCachePath(Uri) par
public string GetCachePath(Uri uri)
{
if (uri == null)
{
throw new ArgumentNullException("uri");
}
if (!UsingCache)
{
throw new HtmlWebException("Cache is not enabled. Set UsingCache to
true first.");
}
string cachePath = Path.Combine(_cachePath, (uri.Host + "" +
uri.Port + uri.AbsolutePath).Replace('/', ''));
if (uri.AbsolutePath.EndsWith("/"))
{
cachePath = Path.Combine(cachePath, ".htm");
}
if (uri.Query.Length > 1)
{
cachePath += "" + uri.Query.Substring(1);
}
return cachePath;
}
2) Remplacer le code de LoadUrl(Uri, string) par
private HtmlDocument LoadUrl(Uri uri, string method)
{
HtmlDocument doc = new HtmlDocument();
doc.OptionAutoCloseOnEnd = false;
doc.OptionFixNestedTags = true;
_statusCode = Get(uri, method, null, doc);
if ((_statusCode == HttpStatusCode.NotModified) || (UsingCache))
{
// read cached encoding
doc.DetectEncodingAndLoad(GetCachePath(uri));
}
return doc;
}
Concernant l'encodage des pages HTML, c'est toujours une histoire
compliquée en WEB. L'encoding d'une page HTML envoyé par un flux HTTP se
détermine de plusieurs manières
1) le contenu de la page peut l'indiquer dans une balise méta du genrce:
<META http-equiv="Content-Type" content="text/html; charset=utf-8" >
2) théoriquement, le contenu du méta HTML ci dessus doit se trouver aussi
dans le stream HTTP, dans le header Content-Type
3) on peut aussi le trouver avec header HTTP Content-Encoding
4) enfin, on peut se baser sur le byte order mark (ou BOM), qui peut (ou
pas) se trouver au tout début du fichier (cf doc/google sur le sujet)
Bref, c'est théoriquement très compliqué :-) En pratique, si vous avez un
exemple précis, je peux jeter un coup d'oil
Sur la question des InnerText, il faut récupérer tous les nouds de type
commentaire et les supprimer
Simon.
www.softfluent.com
"wmn" a écrit dans le message de news:
451d7336$0$21144$Bonsoir,
D'abord un grand merci à Simon Mourier pour le Html Agility Pack ... une
perle.
1. Il me semble être confronté à un bug avec la classe HtmlWeb et sa
fonction de cache. Ci-dessous le code qui pose problème, la 1ère url
fonctionne, pas les 4 autres. Qu'en pensez-vous ?
2. Il me semble également que l'encodage des pages html pose parfois
problème lorsqu'on se passe de la fonction de cache.
3.Une autre question par la même occasion, comment peut-on supprimer les
commentaires une fois InnerText appelé sur un HtmlNode.
Merci d'avance,
WMN
string url;
// ça fonctionne
url =
"http://www.ens-lyon.fr/Planet-Terre/Infosciences/Climats/Ocean/Articles/elevation-glaces.htm";
// ça fonctionne pas
url = "http://blogs.msdn.com/smourier/archive/2003/06/04/8265.aspx";
url =
"http://www.codeplex.com/Wiki/View.aspx?ProjectName=htmlagilitypack";
url = "http://www.yahoo.fr";
url = "http://www.google.fr";
HtmlWeb htmlWeb = new HtmlWeb();
htmlWeb.AutoDetectEncoding = true;
htmlWeb.CachePath = "tmp";
htmlWeb.UsingCache = true;
htmlWeb.CacheOnly = false;
HtmlDocument htmlDoc = htmlWeb.Load(url);
Console.WriteLine(htmlDoc.DocumentNode.InnerHtml);
Console.WriteLine();
Console.WriteLine("Press Enter to exit");
Console.ReadLine();
Concernant l'encoding, je ne vois pas la différence avec cache et sans
cache, j'ai des accents 'é' dans les deux modes. Mais n'utilisez jamais la
console Windows pour afficher des caractères accentués. Il faut vérifier
cela avec notepad ou un éditeur de texte supportant les différents encoding.
Concernant l'encoding, je ne vois pas la différence avec cache et sans
cache, j'ai des accents 'é' dans les deux modes. Mais n'utilisez jamais la
console Windows pour afficher des caractères accentués. Il faut vérifier
cela avec notepad ou un éditeur de texte supportant les différents encoding.
Concernant l'encoding, je ne vois pas la différence avec cache et sans
cache, j'ai des accents 'é' dans les deux modes. Mais n'utilisez jamais la
console Windows pour afficher des caractères accentués. Il faut vérifier
cela avec notepad ou un éditeur de texte supportant les différents encoding.
> D'abord merci pour cette librairie!
J'ai aussi des problèmes avec les lettres accentuées qui disparaissent.
Le code:
HtmlWeb hw = new HtmlWeb();
hw.AutoDetectEncoding = true;
string url = @"http://painbio.com";
HtmlDocument doc = hw.Load(url);
doc.Save("test.htm");
Dans le debugger, je vois qu'il y a un problème dans
HtmlDocument.ReadDocumentEncoding(HtmlNode node) quand on est sur la
ligne <meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" /> de la page web:
_streamEncoding est alors à UTF8Encoding et _declaredencoding est mis à
Latin1Encoding donc des codepages différents...
Une idée pour régler ce problème ?
> D'abord merci pour cette librairie!
J'ai aussi des problèmes avec les lettres accentuées qui disparaissent.
Le code:
HtmlWeb hw = new HtmlWeb();
hw.AutoDetectEncoding = true;
string url = @"http://painbio.com";
HtmlDocument doc = hw.Load(url);
doc.Save("test.htm");
Dans le debugger, je vois qu'il y a un problème dans
HtmlDocument.ReadDocumentEncoding(HtmlNode node) quand on est sur la
ligne <meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" /> de la page web:
_streamEncoding est alors à UTF8Encoding et _declaredencoding est mis à
Latin1Encoding donc des codepages différents...
Une idée pour régler ce problème ?
> D'abord merci pour cette librairie!
J'ai aussi des problèmes avec les lettres accentuées qui disparaissent.
Le code:
HtmlWeb hw = new HtmlWeb();
hw.AutoDetectEncoding = true;
string url = @"http://painbio.com";
HtmlDocument doc = hw.Load(url);
doc.Save("test.htm");
Dans le debugger, je vois qu'il y a un problème dans
HtmlDocument.ReadDocumentEncoding(HtmlNode node) quand on est sur la
ligne <meta http-equiv="Content-Type" content="text/html;
charset=iso-8859-1" /> de la page web:
_streamEncoding est alors à UTF8Encoding et _declaredencoding est mis à
Latin1Encoding donc des codepages différents...
Une idée pour régler ce problème ?