Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

html agility pack

5 réponses
Avatar
wmn
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();

5 réponses

Avatar
Simon Mourier [SoftFluent]
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();


Avatar
wmn
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();






Avatar
Simon Mourier [SoftFluent]
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.

Simon.
www.softfluent.com


"wmn" a écrit dans le message de news:
451f993d$0$21145$
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();







Avatar
Antoine Polatouche
Simon Mourier [SoftFluent] a écrit :
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 ?
Avatar
Antoine Polatouche
> 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 ?



J'ai trouvé une solution qui me semble satisfaisante:

dans HtmlWeb.HttpStatusCode Get(Uri uri, string method, string path,
HtmlDocument doc)
j'ai ajouté quelques lignes qui testent le Charset quand le
ContentEncoding est vide, ce qui est le cas dans les tests que j'ai faits:

if ((resp.ContentEncoding != null) && (resp.ContentEncoding.Length>0))
{
respenc = System.Text.Encoding.GetEncoding(resp.ContentEncoding);
}
else
{
if(resp.CharacterSet != null && resp.CharacterSet.Length>0)
{
respenc = System.Text.Encoding.GetEncoding(resp.CharacterSet);
}
else
respenc = null;
}

Est-ce que ça vous semble convenir ?