Discussion:
Quelltext aus externem IE auslesen
(zu alt für eine Antwort)
Patrick Wohlann
2008-09-05 15:03:42 UTC
Permalink
Hallo zusammen!

Folgende Frage:
Ich muss aus einem geöffneten (externen!) IE-Fenster denn Quellcode auslesen
um z.B. Artikelnummern auszulesen.
Bisher habe ich einfach die URL mit
ReadText(window_hwnd)
ausgelesen (das FensterHandle hab ich)und diese dann in access mit
webbrowser.navigate(URL)
geöffnet und mit WebBrowser1.Document.body.innerhtml
den Quellcode ausgelesen. Bei bestimmten Seiten geht das aber nicht, da
diese mich auf die Startseite zurückbringen.
Ich brauche also etwas um den Quellcode direkt aus dem geöffneten Internet
Explorer zu lesen. So was wie
leseQuellcode(window_hwnd)
Konnte sowas aber bisher nicht finden. Hoffentlich wisst ihr Rat....
Danke im Voraus

Wohlann
Wolfgang Badura
2008-09-06 11:36:46 UTC
Permalink
Hallo Patrick
Post by Patrick Wohlann
Bisher habe ich einfach die URL mit
ReadText(window_hwnd)
ausgelesen (das FensterHandle hab ich)
Kannst Du erläutern was Du in ReadText(window_hwnd)
tust?
Wolfgang
Wolfgang Badura
2008-09-07 10:59:21 UTC
Permalink
Hallo Patrick!
Post by Patrick Wohlann
Ich brauche also etwas um den Quellcode direkt aus dem geöffneten Internet
Explorer zu lesen. So was wie
leseQuellcode(window_hwnd)
Ich habe da etwas gefunden, was ohne IE "Quelltext" lesen kann::
http://msdn.microsoft.com/en-us/library/ms760305.aspx
Es handelt sich bei "Microsoft.XMLHTTP" um ein Objekt, das auf die Schnelle
aus dem Internet etwas lesen kann.
Das geht natürlich nur dann, wenn Du die URL kennst!
Dafür bedarf es nicht einmal irgendeines Verweises.
Ein Beispiel für dieses Objekt findest Du unter
http://www.access-im-unternehmen.de/605.0.html.
Ein weiterer Hit ist dabei das Objekt
"htmlfile", welches in der Lage ist den HTML-Text der Antwort nach vielen
Kriterien zu parsen.
Doch das, glaube ich, kennst Du ja schon
Post by Patrick Wohlann
WebBrowser1.Document.body.innerhtml
Wolfgang
Patrick Wohlann
2008-09-08 08:23:10 UTC
Permalink
Hallo Wolfgang,
danke erstmal für die Hilfe. Entschuldige die knappe Ausführung ich hoffe
diese wird im Gegenzug nicht zu lang. :)
Post by Patrick Wohlann
Bisher habe ich einfach die URL mit
ReadText(window_hwnd)
ausgelesen (das FensterHandle hab ich)
Post by Wolfgang Badura
Kannst Du erläutern was Du in ReadText(window_hwnd)
tust?
Also die Grundsätzliche Idee ist folgende: Ein User soll die Möglichkeit
haben per Click Produktbeschreibungen aus einer Webseite, welche er im
InternetExplorer betrachtet, in ein Formular zu übernehmen. Dazu wird bisher
die URL aus dem IE ausgelesen und mit dem internen webbrowserobjekt
geöffnet.
Aus dem webbrowserobjekt wird dann der Quelltext ausgelesen und die
Produktbeschreibung übernommen.
Das ganze sieht jetzt etwa so aus(etwas gekürzt):

Private Sub Befehl27_Click() 'Button wurde gedrueckt
On Error GoTo Err_Befehl27_Click
...

sViewedURL = GetURLList()
WebBrowser1.Navigate (sViewedURL)
Produktbeschreibung = WebBrowser1.Document.body.innerhtml
...

End Sub
-------------------
Public Function GetURLList() As String
..
EnumWindows AddressOf EnumerateProc, 0
If Len(sURLList) > 0 Then

sURLList = Mid(sURLList, 2)
End If
GetURLList = sURLList

sURLList = ""
End Function
-----------------
Private Function EnumerateProc( _ 'Suche den Internet Explorer
ByVal app_hwnd As Long, _
ByVal lParam As Long) As Boolean

...

' Fenstertitel auslesen.
length = GetWindowText(app_hwnd, buf, Len(buf))

Title = Left$(buf, length)

' zusätzlich Name der Fensterklasse bestimmen
' ist es ein Internet Explorer Fenster, so lautet der Klassenname
"IEFrame"
length = 256
buf = Space$(length - 1)
length = GetClassName(app_hwnd, buf, length)
buf = Left$(buf, length)

If InStr(1, Title, "Opera", 1) Or _
InStr(1, Title, "Netscape", 1) Or _
Trim(buf) = "IEFrame" Or InStr(1, Title, "SlimBrowser") Then
sURLList = sURLList & "," & getURL(app_hwnd)
End If

' Weitersuchen...
EnumerateProc = 1
End Function
-------------------------
Private Function getURL(window_hwnd As Long) As String
Dim txt As String
Dim buf As String
Dim buflen As Long
Dim child_hwnd As Long
Dim children() As Long
Dim num_children As Integer
Dim i As Integer
Dim sURL As String

' Klassennamen ermitteln --> wir wollen "Edit"
buflen = 256
buf = Space$(buflen - 1)
buflen = GetClassName(window_hwnd, buf, buflen)
buf = Left$(buf, buflen)

' Edit-Klasse gefunden ?
If buf = "Edit" Then
' ja, d.h. wir brauchen nur noch den
' Text auslesen
sURL = ReadText(window_hwnd)
If IsGoodURL(sURL) Then
getURL = sURL
Exit Function
End If
End If

' kein Edit-Objekt oder ungültige URL :(
' wir müssen die (weiteren) Childs
' durchsuchen (rekursiv)
num_children = 0
child_hwnd = GetWindow(window_hwnd, GW_CHILD)
Do While child_hwnd <> 0
num_children = num_children + 1
ReDim Preserve children(1 To num_children)
children(num_children) = child_hwnd
child_hwnd = GetWindow(child_hwnd, GW_HWNDNEXT)
Loop

' wir untersuchen wiederrum die Child's,
' ob sie vom Typ Edit sind
For i = 1 To num_children
txt = getURL(children(i))
If txt <> "" Then Exit For
Next i

getURL = txt
End Function
-----------------------------------
Private Function ReadText(window_hwnd As Long) As String
Dim txtlen As Long
Dim txt As String

ReadText = ""
If window_hwnd = 0 Then Exit Function

txtlen = SendMessage(window_hwnd, WM_GETTEXTLENGTH, 0, 0)
If txtlen = 0 Then Exit Function

txtlen = txtlen + 1
txt = Space$(txtlen)
txtlen = SendMessage(window_hwnd, WM_GETTEXT, txtlen, ByVal txt)

ReadText = Left$(txt, txtlen)
End Function

Soweit, sogut. Nun gibt es Webswebseiten wo diese Methode nicht
funktioniert, da
man beim öffenen der URL im webbrowser auf die Startseite redirected wird
und das
Programm nicht weiß, welches Produkt der User grad betrachtet hat (z.B.
anhand der Artikelnummer):(
Deshalb würd ich gern den Quelltext der betrachteten Seite direkt auslesen,
so wie ich ja auch die URL auslese.
Post by Patrick Wohlann
http://msdn.microsoft.com/en-us/library/ms760305.aspx
Es handelt sich bei "Microsoft.XMLHTTP" um ein Objekt, das auf die
Schnelle aus dem Internet etwas lesen kann.
Das geht natürlich nur dann, wenn Du die URL kennst!
Dafür bedarf es nicht einmal irgendeines Verweises.
Ein Beispiel für dieses Objekt findest Du unter
http://www.access-im-unternehmen.de/605.0.html.
Ein weiterer Hit ist dabei das Objekt
"htmlfile", welches in der Lage ist den HTML-Text der Antwort nach vielen
Kriterien zu parsen.
Doch das, glaube ich, kennst Du ja schon
Post by Wolfgang Badura
WebBrowser1.Document.body.innerhtml
Das ist zwar schon hilfreich stellt mich aber vor dasselbe Problem, da ich
auch hier nur die html der Startseite bekomme.
Noch andere Ideen?

Patrick
Wolfgang Badura
2008-09-08 10:14:04 UTC
Permalink
Hallo Patrick!
Danke für die ausführlichen Informationen.
Post by Patrick Wohlann
Das ist zwar schon hilfreich stellt mich aber vor dasselbe Problem, da ich
auch hier nur die html der Startseite bekomme.
Kannst Du mir ein Beispiel einer solchen URL geben?
Ich werde versuchen, den Text mit einer weiteren Variante (ich hab' da mit
VB6 einmal einiges ausprobiert) auszulesen.
Vielleicht geht es damit.
Mit Gruß aus Wien, Wolfgang
Patrick Wohlann
2008-09-09 07:08:53 UTC
Permalink
Post by Wolfgang Badura
Kannst Du mir ein Beispiel einer solchen URL geben?
Ich werde versuchen, den Text mit einer weiteren Variante (ich hab' da mit
VB6 einmal einiges ausprobiert) auszulesen.
Vielleicht geht es damit.
Mit Gruß aus Wien, Wolfgang
Hallo nochmal,
Problem ist gelöst. Hab mich dabei an folgendem Beispiel orientiert.
http://www.mvps.org/access/modules/mdl0062.htm
Meine Lösung sieht jetzt folgendermaßen aus:

*****************************************************
Public Function gethtml()

On Error GoTo ErrHandler
Dim quellcode As String
Dim objShellWins As SHDocVw.ShellWindows
Dim objIE As SHDocVw.InternetExplorer
Const URL_TO_SEARCH = "http://www.google.de"

' Instantiate
Set objShellWins = New SHDocVw.ShellWindows
' There might be multiple IE windows open
For Each objIE In objShellWins
' Try to locate the browser with a specific address
' in it's AddressBar.
If (InStr(1, _
objIE.LocationURL, _
URL_TO_SEARCH, vbTextCompare) <> 0) Then
'get sourcecode
quellcode = objIE.Document.body.innerHTML
End If
Next

gethtml = quellcode


ErrHandler:
Resume Next

End Function
*****************************************************
Vielen Dank nochmal für deine Bemühungen!
Grüße aus Berlin, Patrick :)
Wolfgang Badura
2008-09-09 22:14:57 UTC
Permalink
Hallo Patrick!
Post by Wolfgang Badura
Kannst Du mir ein Beispiel einer solchen URL geben?
Es freut mich, daß Du eine Lösung gefunden hast.
Trotzdem interessiert mich, ob ich mit meinem VB6-Programm das Problem
gelöst hätte.
Ich ersuche Dich deshalb nochmals um eine Beispiel-URL.
Wolfgang
Patrick Wohlann
2008-09-10 12:32:36 UTC
Permalink
Post by Wolfgang Badura
Es freut mich, daß Du eine Lösung gefunden hast.
Trotzdem interessiert mich, ob ich mit meinem VB6-Programm das Problem
gelöst hätte.
Ich ersuche Dich deshalb nochmals um eine Beispiel-URL.
Wolfgang
Kann ich dir gerne geben: http://intouch.techdata.com
Allerdings verlangt diese ein Login, so dass dir das nicht viel nützen
wird, fürchte ich. Sorry! Du kannst natürlich den öffentlichen Bereich
versuchen http://www.techdata.de , dort kommst du allerdings nicht zum
Händlershop welcher mir solche Kopfschmerzen bereitet hat (ausser du loggst
dich ein).
Jedenfalls Danke nochmal!
Grüße!
Patrick
Wolfgang Badura
2008-09-11 14:02:12 UTC
Permalink
Hallo Patrick!
Post by Patrick Wohlann
Kann ich dir gerne geben: http://intouch.techdata.com
Allerdings verlangt diese ein Login, so dass dir das nicht viel nützen
wird, fürchte ich. Sorry! Du kannst natürlich den öffentlichen Bereich
versuchen http://www.techdata.de , dort kommst du allerdings nicht zum
Händlershop welcher mir solche Kopfschmerzen bereitet hat (ausser du loggst
dich ein).
Jedenfalls Danke nochmal!
Grüße!
Patrick
Schade, Wolfgang

Übrigens ist die Lösung höchst bemerkenswert.
Da wundert man sich oft, was es so alles in den Tiefen des Systems gibt.
Loading...