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

Code source HTML

6 réponses
Avatar
Jo
Bonjour à tout le groupe.

J'essaie de récupérer dans une variable texte le code source HTML d'une page
web. A priori, cela ne devrait pas être bien sorcier, mais comme je suis
débutant, je bloque un peu. Sur un site j'ai trouvé le code suivant

<<
Dim MSH As New MSHTML.HTMLDocument
Dim doc As MSHTML.IHTMLDocument2

Set doc = MSH.createDocumentFromUrl(FileName, "mon URL à récupérer")
Do While doc.readyState <> "complete"
DoEvents
Loop
txtHtml = doc.documentElement.innerHTML
>>

Mais voilà, Visual Studio ne digère pas:
- "Type 'MSHTML.HTMLDocument' non défini'. Idem pour MSHTML.ITMLDocument2
- Le nom 'FileName' n'est pas déclaré
- Le nom 'DoEvents' n'est pas déclaré
- Le nom 'txtHTML' n'est pas déclaré

Je dois certainement faire quelques "déclarations" préalables, mais je suis
trop novice que pour savoir lesquelles.
L'un de vous pourrait-il m'éclairer?

Merci bcp,

Jo

6 réponses

Avatar
Marc
"Jo" <jo[nosp]@donotuse.com> a écrit dans le message de news:
4a23b80b$0$2856$
Bonjour à tout le groupe.

J'essaie de récupérer dans une variable texte le code source HTML d'une
page web. A priori, cela ne devrait pas être bien sorcier,



Oui, 1 ligne de code avec l'api Shell, qui est donc la méthode la plus
simple....
Avatar
Jacques93
Bonjour Jo,
Jo a écrit :
Bonjour à tout le groupe.

J'essaie de récupérer dans une variable texte le code source HTML d'une
page web. A priori, cela ne devrait pas être bien sorcier, mais comme
je suis débutant, je bloque un peu. Sur un site j'ai trouvé le code
suivant

<<
Dim MSH As New MSHTML.HTMLDocument
Dim doc As MSHTML.IHTMLDocument2

Set doc = MSH.createDocumentFromUrl(FileName, "mon URL à récupérer")
Do While doc.readyState <> "complete"
DoEvents
Loop
txtHtml = doc.documentElement.innerHTML






Mais voilà, Visual Studio ne digère pas:
- "Type 'MSHTML.HTMLDocument' non défini'. Idem pour MSHTML.ITMLDocument2
- Le nom 'FileName' n'est pas déclaré
- Le nom 'DoEvents' n'est pas déclaré
- Le nom 'txtHTML' n'est pas déclaré

Je dois certainement faire quelques "déclarations" préalables, mais je
suis trop novice que pour savoir lesquelles.
L'un de vous pourrait-il m'éclairer?




En premier lieu, le fait que tu sembles obtenir toutes les erreurs
ensemble, et que DoEvents ne soit pas reconnu comme instruction, indique
que tu ne travaille pas avec VB6, mais avec .Net. Exact ?

Voici la piste avec .Net 2005 :

Pour 'MSHTML.HTMLDocument' et 'MSHTML.ITML.Document2', il faut ajouter
une référence :

Projet => Ajouter une référence..., Onglet .NET =>

Micrososft.mshtml

La liste est par ordre alphabétique, et pour moi sous Vista SP2 :
Version 7.0.3300.0, RunTime v1.0.3705

Pour 'Doevents', il faut utiliser :

Application.Doevents ()

Le reste concerne des variables non déclarées (de type String)

Ton exemple contient une erreur , y compris pour VB6 :

Set doc = MSH.createDocumentFromUrl(FileName, "mon URL à récupérer")

FileName doit contenir l'URL, le second paramètre est généralement
vbNullString.


Toutefois, afin d'éviter une erreur 'AccessViolationExeption' sur cette
instruction, il faut "caster" la classe HTMLDocument class à
IPersistStream :

<http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/cfbe816a-dc15-4a73-a7fc-8dfbf01d98f0>


Pour résumer, un petit code, qui fonctionne avec VB 2005 (à coller dans
Form1.vb, par exemple) :

'==================================================================================================== Option Strict Off
Option Explicit On
Imports System.Runtime.InteropServices

<ComVisible(True), ComImport(),
Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"), _
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IPersistStreamInit
Sub GetClassID(ByRef pClassID As Guid)
<PreserveSig()> Function IsDirty() As Integer
<PreserveSig()> Function Load(ByVal pstm As ComTypes.IStream) As
Integer
<PreserveSig()> Function Save(ByVal pstm As ComTypes.IStream, _
ByVal ByValByValfClearDirty As Boolean) As Integer
<PreserveSig()> Function GetSizeMax(<InAttribute(), Out(), _
MarshalAs(UnmanagedType.U8)> ByRef pcbSize As Long)
As Integer
<PreserveSig()> Function InitNew() As Integer
End Interface

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MSH As New mshtml.HTMLDocument
Dim doc As mshtml.IHTMLDocument2
Dim iPersistStream As IPersistStreamInit
Dim FileName As String, txtHtml As String

FileName = "http://www.google.fr"
iPersistStream = DirectCast(MSH, IPersistStreamInit)
iPersistStream.InitNew()
doc = MSH.createDocumentFromUrl(FileName, vbNullString)
Do While doc.readyState <> "complete"
Application.DoEvents()
Loop
txtHtml = doc.documentElement.innerHTML()
Debug.Print(txtHtml)
doc.close()
MSH = Nothing
End Sub
End Class
'====================================================================================================
Je ne l'ai pas mis sur une ligne, afin d'être plus lisible ;-)

--

Cordialement,

Jacques.
Avatar
Jo
Merci beaucoup Jacques. Finalement dans .NET il n'y avait pas
Microsoft.mshtml alors j'ai téléchargé la dll du même nom et l'ai rajoutée
comme référence avec l'onglet "parcourir". Cela solutionne mes petits
soucis d'erreurs et de déclaration.

Par contre, j'ai des pb avec le "castage". Je ne comprends absolument pas
de quoi il s'agit. J'ai donc recopié purement et simplement.
Quand j'exécute en debug, parfois ça fonctionne et parfois pas; j'ai essayé
plusieurs fois avec une page du type "perso" (sans userid / pwd).

J'ai également essayé sur ma page facebook en ayant ouvert une session dans
IE, mais là, c'est le délire total (Visual Studio bascule vers IE, puis IE
clignote et rien ne se passe).

Bref... j'ai encore quelques heures devant moi à consacrer pour comprendre
un peu mieux tout ça ;-))))



"Jacques93" a écrit dans le message de
news:

Toutefois, afin d'éviter une erreur 'AccessViolationExeption' sur cette
instruction, il faut "caster" la classe HTMLDocument class à
IPersistStream :

<http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/cfbe816a-dc15-4a73-a7fc-8dfbf01d98f0>


Pour résumer, un petit code, qui fonctionne avec VB 2005 (à coller dans
Form1.vb, par exemple) :

'==================================================================================================== > Option Strict Off
Option Explicit On
Imports System.Runtime.InteropServices

<ComVisible(True), ComImport(),
Guid("7FD52380-4E07-101B-AE2D-08002B2EC713"), _
InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIUnknown)> _
Public Interface IPersistStreamInit
Sub GetClassID(ByRef pClassID As Guid)
<PreserveSig()> Function IsDirty() As Integer
<PreserveSig()> Function Load(ByVal pstm As ComTypes.IStream) As
Integer
<PreserveSig()> Function Save(ByVal pstm As ComTypes.IStream, _
ByVal ByValByValfClearDirty As Boolean) As Integer
<PreserveSig()> Function GetSizeMax(<InAttribute(), Out(), _
MarshalAs(UnmanagedType.U8)> ByRef pcbSize As Long) As
Integer
<PreserveSig()> Function InitNew() As Integer
End Interface

Public Class Form1

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim MSH As New mshtml.HTMLDocument
Dim doc As mshtml.IHTMLDocument2
Dim iPersistStream As IPersistStreamInit
Dim FileName As String, txtHtml As String

FileName = "http://www.google.fr"
iPersistStream = DirectCast(MSH, IPersistStreamInit)
iPersistStream.InitNew()
doc = MSH.createDocumentFromUrl(FileName, vbNullString)
Do While doc.readyState <> "complete"
Application.DoEvents()
Loop
txtHtml = doc.documentElement.innerHTML()
Debug.Print(txtHtml)
doc.close()
MSH = Nothing
End Sub
End Class
'==================================================================================================== >
Je ne l'ai pas mis sur une ligne, afin d'être plus lisible ;-)

--

Cordialement,

Jacques.


Avatar
Jacques93
Jo a écrit :
Merci beaucoup Jacques. Finalement dans .NET il n'y avait pas
Microsoft.mshtml alors j'ai téléchargé la dll du même nom et l'ai
rajoutée comme référence avec l'onglet "parcourir". Cela solutionne mes
petits soucis d'erreurs et de déclaration.



De mon côté, je l'ai dans :

C:Program FilesMicrosoft.NETPrimary Interop Assemblies

et il semble bien lié à VS2005 (Date du 09/12/2005)

Par contre, j'ai des pb avec le "castage". Je ne comprends absolument
pas de quoi il s'agit. J'ai donc recopié purement et simplement.
Quand j'exécute en debug, parfois ça fonctionne et parfois pas; j'ai
essayé plusieurs fois avec une page du type "perso" (sans userid / pwd).



Le "castage" consiste en gros à forcer la conversion de type de données.
Parfois celle-ci est implicite, parfois non ...

<http://msdn.microsoft.com/en-us/library/7k6y2h6x(VS.71).aspx>

Il est tout à fait possible que dans la cas présent, cela soit lié à la
version 2005. Est ce celle la que tu utilises ?

J'ai également essayé sur ma page facebook en ayant ouvert une session
dans IE, mais là, c'est le délire total (Visual Studio bascule vers IE,
puis IE clignote et rien ne se passe).

Bref... j'ai encore quelques heures devant moi à consacrer pour
comprendre un peu mieux tout ça ;-))))




Juste une précision, on peut utiliser MsHtml avec ou sans WebBrowser,
mais le fonctionnement diffère un peu.

J'ai oublié dans ma réponse précédente de préciser que ce groupe est
plutôt dédié à VB5 / VB6. Il existe un groupe spécifique à .Net :

microsoft.public.fr.dotnet.vb

tu devrais y trouver des personnes plus avertis dans ce domaine. Il
n'est pas impossible que dans les dernières versions de .Net (2008),
l'utilisation de MsHtml ne soit plus nécessaire (hypothèse gratuite,
mais à vérifier...)

--

Cordialement,

Jacques.
Avatar
Jo
Merci Jacques. J'utilise Microsoft Visual Studio 2008, version 9.021.
Microsoft Net Framework, version 3.5 SP1.
Pour moi, visual basic V6 ou .NET, je ne connais pas trop la différence. Je
vais cependant aller raconter notre échange sur ... dotnet.vb

Mille excuses pour les V6 que j'aurais importunés.

Entretemps j'ai essayé avec vbscript sur base d'un bout de code reçu en son
temps d'un ami.

<<
Dim IE
Set wshShell = WScript.CreateObject ("WScript.shell")
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate("http://www.google.fr")
Do While (IE.Busy)
WScript.Sleep 10
Loop
wshShell.AppActivate("Internet Explorer")
Data = IE.Document.documentElement.innerHTML ' Data contient tout le code
source de la page web
WScript.Echo "Code " & Data
IE.quit
WScript.Quit






... mais la commande WScript.Echo ne donne rien...



"Jacques93" a écrit dans le message de
news:
Jo a écrit :
Merci beaucoup Jacques. Finalement dans .NET il n'y avait pas
Microsoft.mshtml alors j'ai téléchargé la dll du même nom et l'ai
rajoutée comme référence avec l'onglet "parcourir". Cela solutionne mes
petits soucis d'erreurs et de déclaration.



De mon côté, je l'ai dans :

C:Program FilesMicrosoft.NETPrimary Interop Assemblies

et il semble bien lié à VS2005 (Date du 09/12/2005)

Par contre, j'ai des pb avec le "castage". Je ne comprends absolument
pas de quoi il s'agit. J'ai donc recopié purement et simplement.
Quand j'exécute en debug, parfois ça fonctionne et parfois pas; j'ai
essayé plusieurs fois avec une page du type "perso" (sans userid / pwd).



Le "castage" consiste en gros à forcer la conversion de type de données.
Parfois celle-ci est implicite, parfois non ...

<http://msdn.microsoft.com/en-us/library/7k6y2h6x(VS.71).aspx>

Il est tout à fait possible que dans la cas présent, cela soit lié à la
version 2005. Est ce celle la que tu utilises ?

J'ai également essayé sur ma page facebook en ayant ouvert une session
dans IE, mais là, c'est le délire total (Visual Studio bascule vers IE,
puis IE clignote et rien ne se passe).

Bref... j'ai encore quelques heures devant moi à consacrer pour
comprendre un peu mieux tout ça ;-))))




Juste une précision, on peut utiliser MsHtml avec ou sans WebBrowser, mais
le fonctionnement diffère un peu.

J'ai oublié dans ma réponse précédente de préciser que ce groupe est
plutôt dédié à VB5 / VB6. Il existe un groupe spécifique à .Net :

microsoft.public.fr.dotnet.vb

tu devrais y trouver des personnes plus avertis dans ce domaine. Il n'est
pas impossible que dans les dernières versions de .Net (2008),
l'utilisation de MsHtml ne soit plus nécessaire (hypothèse gratuite, mais
à vérifier...)

--

Cordialement,

Jacques.


Avatar
Jacques93
Jo a écrit :

Merci Jacques. J'utilise Microsoft Visual Studio 2008, version 9.021.
Microsoft Net Framework, version 3.5 SP1.
Pour moi, visual basic V6 ou .NET, je ne connais pas trop la
différence. Je vais cependant aller raconter notre échange sur ...
dotnet.vb

Mille excuses pour les V6 que j'aurais importunés.



Pas grave, le but de ma remarque était d'orienter sur un groupe plus
pertinent ...


Entretemps j'ai essayé avec vbscript sur base d'un bout de code reçu en
son temps d'un ami.

<<
Dim IE
Set wshShell = WScript.CreateObject ("WScript.shell")
Set IE = CreateObject("InternetExplorer.Application")
IE.navigate("http://www.google.fr")
Do While (IE.Busy)
WScript.Sleep 10
Loop
wshShell.AppActivate("Internet Explorer")
Data = IE.Document.documentElement.innerHTML ' Data contient tout le
code source de la page web
WScript.Echo "Code " & Data
IE.quit
WScript.Quit






... mais la commande WScript.Echo ne donne rien...




Bizarre ... Qu'utilises tu pour exécuter les vbs ?

CScript ou Wscript ?

Voilà ce que j'obtiens avec Cscript :

<http://cjoint.com/?gbweN4t8nx>

et avec Wscript :

<http://cjoint.com/?gbwfwQsCPn>

--

Cordialement,

Jacques.