Gibt es eine schnellere Methode für _IEBodyReadHTML, die den selben String zurückgibt?
Schnellere Methode für _IEBodyReadHTML?
-
- [ gelöst ]
-
Nathax -
3. Juni 2011 um 23:58 -
Geschlossen -
Erledigt
-
-
Mit StringRegExp geht das schneller, allerdings nur wenn du den Quelltext bereits hast... Ansonsten geht das gar nicht anders. Willst du unbedingt mit den IE Funktionen arbeiten, oder würde dich die InetRead Funktion zufriedenstellen?
[autoit]$aBody = StringRegExp($sHTML, '(?s)<body>(.+)</body>', 3)
[/autoit]
ConsoleWrite($aBody[0] & @CRLF) -
Es geht um sehr viele Seiten, die verarbeitet werden müssen, deshalb möchte ich ja vom langsamen IE weg,
oder kann man mithilfe einer IE-Funktion den Quelltext bekommen ohne vorher in einem Objekt zu der Seite zu navigieren?
Jede Seite mit INetRead downzuloaden dauert glaub ich auch zu lange.
Ich habe INetGetSource getestet, aber es liefert einen anderes Quelltext-Format zurück, und somit funktioniert mein Programm nicht mehr.
_INetGetSource erkennt z.B kein "e" mit Betonung, sondern setzt dafür einen Code ein. -
Das sind die HTML-Entitäten.
Die musst du noch umwandeln.
Die häufigsten solltest du mit dieser Funktion erwischen:Spoiler anzeigen
[autoit]Global $s_URL = "http://www.autoit.de"
[/autoit] [autoit][/autoit] [autoit]Global $a_BodySource = StringRegExp(_ConvertEntities(BinaryToString(InetRead($s_URL))), '(?s)<body[^>]*>(.+)</body>', 1)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
ConsoleWrite($a_BodySource[0] & @CRLF)Func _ConvertEntities($s_Source)
[/autoit]
Local $aEntities[95][2] = [[""", 34],["&", 38],["<", 60],[">", 62],[" ", 32] _
,["¡", 161],["¢", 162],["£", 163],["¤", 164],["¥", 165],["¦", 166] _
,["§", 167],["¨", 168],["©", 169],["ª", 170],["¬", 172],["­", 173] _
,["®", 174],["¯", 175],["°", 176],["±", 177],["²", 178],["³", 179] _
,["´", 180],["µ", 181],["¶", 182],["·", 183],["¸", 184],["¹", 185] _
,["º", 186],["»", 187],["¼", 188],["½", 189],["¾", 190],["¿", 191] _
,["À", 192],["Á", 193],["Ã", 195],["Ä", 196],["Å", 197],["Æ", 198] _
,["Ç", 199],["È", 200],["É", 201],["Ê", 202],["Ì", 204],["Í", 205] _
,["Î", 206],["Ï", 207],["Ð", 208],["Ñ", 209],["Ò", 210],["Ó", 211] _
,["Ô", 212],["Õ", 213],["Ö", 214],["×", 215],["Ø", 216],["Ù", 217] _
,["Ú", 218],["Û", 219],["Ü", 220],["Ý", 221],["Þ", 222],["ß", 223] _
,["à", 224],["á", 225],["â", 226],["ã", 227],["ä", 228],["å", 229] _
,["æ", 230],["ç", 231],["è", 232],["é", 233],["ê", 234],["ë", 235] _
,["ì", 236],["í", 237],["î", 238],["ï", 239],["ð", 240],["ñ", 241] _
,["ò", 242],["ó", 243],["ô", 244],["õ", 245],["ö", 246],["÷", 247] _
,["ø", 248],["ù", 249],["ú", 250],["û", 251],["ü", 252],["þ", 254]]
For $x = 0 To UBound($aEntities) - 1
$s_Source = StringReplace($s_Source, $aEntities[$x][0], Chr($aEntities[$x][1]), 0, 2)
Next
For $x = 32 To 255
$s_Source = StringReplace($s_Source, "&#" & $x & ";", ChrW($x))
Next
Return $s_Source
EndFunc -
InetGetSource ist das selbe wie InetRead...
[autoit='_INetGetSource']; #FUNCTION# ====================================================================================================================
[/autoit]
; Name...........: _INetGetSource
; Description ...: Gets the source from an URL without writing a temp file.
; Parameters ....: $s_URL - The URL of the site.
; $bString - If True the data is returned in string format, otherwise binary format.
; Return values .: Success - The read string and sets @extended to the number of bytes returned.
; Failure - An empty string and and sets @error to non-zero.
; Author ........: Wouter van Kesteren.
; ===============================================================================================================================
Func _INetGetSource($s_URL, $bString = True)
Local $sString = InetRead($s_URL, 1)
Local $nError = @error, $nExtended = @extended
If $bString Then $sString = BinaryToString($sString)
Return SetError($nError, $nExtended, $sString)
EndFunc ;==>_INetGetSource
Deine Internetverbindung können wir auch nicht beschleunigen. :pinch:
Und wenn du BinaryToString mit 4 als 2tem Parameter verwendest brauchst du AspirinJunkies Funktion noch nicht einmal. -
Und wenn du BinaryToString mit 4 als 2tem Parameter verwendest brauchst du AspirinJunkies Funktion noch nicht einmal.
Bist du sicher?
Bei meinen Versuchen sind, auch als UTF8-codiert ausgelesen, noch genug Entitäten übrig geblieben.
Hätte mich auch gewundert da ich zwischen den HTML-codierten Zeichen und dem verwendeten Zeichensatz keinen Zusammenhang sehe.Um die Funktion von oben noch bisschen zu erweitern so dass mehr Zeichen gefunden werden hab ich jetzt noch mal eine selbst geschrieben:
_ConvertEntities
[autoit]
[/autoit] [autoit][/autoit] [autoit]
Global $s_URL = "http://www.autoit.de"
Global $s_Source = BinaryToString(InetRead($s_URL), 4)_ConvertEntities($s_Source)
[/autoit] [autoit][/autoit] [autoit]ConsoleWrite($s_Source)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]; #FUNCTION# ======================================================================================
[/autoit] [autoit][/autoit] [autoit]
; Name ..........: _ConvertEntities()
; Description ...: Wandelt HTML-Entitäten in einem Quellcode in ihre entsprechenden Zeichen
; Syntax ........: _ConvertEntities($sURL)
; Parameters ....: $sURL - String in welchem die Entitäten umgewandelt werden sollen
; Return values .: nichts (String wird direkt verändert)
; Author ........: AspirinJunkie
; =================================================================================================
Func _ConvertEntities(ByRef $s_S)
Local Static $o_Dict = ObjCreate("Scripting.Dictionary")
Local $a_RegExp, $s_T
Local Static $a_NameEnt[253][2] = [["quot", 34],["amp", 38],["apos", 39],["lt", 60],["gt", 62],["quot", 34],["amp", 38],["apos", 39],["lt", 60],["gt", 62],["nbsp", 160], _
["iexcl", 161],["cent", 162],["pound", 163],["curren", 164],["yen", 165],["brvbar", 166],["sect", 167],["uml", 168],["copy", 169], _
["ordf", 170],["laquo", 171],["not", 172],["reg", 174],["macr", 175],["deg", 176],["plusmn", 177],["sup2", 178],["sup3", 179], _
["acute", 180],["micro", 181],["para", 182],["middot", 183],["cedil", 184],["sup1", 185],["ordm", 186],["raquo", 187], _
["frac14", 188],["frac12", 189],["frac34", 190],["iquest", 191],["Agrave", 192],["Aacute", 193],["Acirc", 194],["Atilde", 195], _
["Auml", 196],["Aring", 197],["AElig", 198],["Ccedil", 199],["Egrave", 200],["Eacute", 201],["Ecirc", 202],["Euml", 203], _
["Igrave", 204],["Iacute", 205],["Icirc", 206],["Iuml", 207],["ETH", 208],["Ntilde", 209],["Ograve", 210],["Oacute", 211], _
["Ocirc", 212],["Otilde", 213],["Ouml", 214],["times", 215],["Oslash", 216],["Ugrave", 217],["Uacute", 218],["Ucirc", 219], _
["Uuml", 220],["Yacute", 221],["THORN", 222],["szlig", 223],["agrave", 224],["aacute", 225],["acirc", 226],["atilde", 227], _
["auml", 228],["aring", 229],["aelig", 230],["ccedil", 231],["egrave", 232],["eacute", 233],["ecirc", 234],["euml", 235], _
["igrave", 236],["iacute", 237],["icirc", 238],["iuml", 239],["eth", 240],["ntilde", 241],["ograve", 242],["oacute", 243],["ocirc", 244], _
["otilde", 245],["ouml", 246],["divide", 247],["oslash", 248],["ugrave", 249],["uacute", 250],["ucirc", 251],["uuml", 252],["yacute", 253], _
["thorn", 254],["yuml", 255],["OElig", 338],["oelig", 339],["Scaron", 352],["scaron", 353],["Yuml", 376],["fnof", 402],["circ", 710], _
["tilde", 732],["Alpha", 913],["Beta", 914],["Gamma", 915],["Delta", 916],["Epsilon", 917],["Zeta", 918],["Eta", 919],["Theta", 920], _
["Iota", 921],["Kappa", 922],["Lambda", 923],["Mu", 924],["Nu", 925],["Xi", 926],["Omicron", 927],["Pi", 928],["Rho", 929],["Sigma", 931], _
["Tau", 932],["Upsilon", 933],["Phi", 934],["Chi", 935],["Psi", 936],["Omega", 937],["alpha", 945],["beta", 946],["gamma", 947], _
["delta", 948],["epsilon", 949],["zeta", 950],["eta", 951],["theta", 952],["iota", 953],["kappa", 954],["lambda", 955],["mu", 956], _
["nu", 957],["xi", 958],["omicron", 959],["pi", 960],["rho", 961],["sigmaf", 962],["sigma", 963],["tau", 964],["upsilon", 965], _
["phi", 966],["chi", 967],["psi", 968],["omega", 969],["thetasym", 977],["upsih", 978],["piv", 982],["ensp", 8194], _
["emsp", 8195],["thinsp", 8201],["ndash", 8211],["mdash", 8212],["lsquo", 8216],["rsquo", 8217],["sbquo", 8218], _
["ldquo", 8220],["rdquo", 8221],["bdquo", 8222],["dagger", 8224],["Dagger", 8225],["bull", 8226],["hellip", 8230], _
["permil", 8240],["prime", 8242],["Prime", 8243],["lsaquo", 8249],["rsaquo", 8250],["oline", 8254],["frasl", 8260], _
["euro", 8364],["image", 8465],["weierp", 8472],["real", 8476],["trade", 8482],["alefsym", 8501],["larr", 8592], _
["uarr", 8593],["rarr", 8594],["darr", 8595],["harr", 8596],["crarr", 8629],["lArr", 8656],["uArr", 8657],["rArr", 8658], _
["dArr", 8659],["hArr", 8660],["forall", 8704],["part", 8706],["exist", 8707],["empty", 8709],["nabla", 8711],["isin", 8712], _
["notin", 8713],["ni", 8715],["prod", 8719],["sum", 8721],["minus", 8722],["lowast", 8727],["radic", 8730],["prop", 8733],["infin", 8734], _
["ang", 8736],["and", 8743],["or", 8744],["cap", 8745],["cup", 8746],["int", 8747],["there4", 8756],["sim", 8764],["cong", 8773], _
["asymp", 8776],["ne", 8800],["equiv", 8801],["le", 8804],["ge", 8805],["sub", 8834],["sup", 8835],["nsub", 8836],["sube", 8838], _
["supe", 8839],["oplus", 8853],["otimes", 8855],["perp", 8869],["sdot", 8901],["lceil", 8968],["rceil", 8969],["lfloor", 8970],["rfloor", 8971], _
["lang", 10216],["rang", 10217],["loz", 9674],["spades", 9824],["clubs", 9827],["hearts", 9829],["diams", 9830]]; Dezimalform:
[/autoit]
$a_RegExp = StringRegExp($s_S, "&#(\d{2,4});", 3)
If IsArray($a_RegExp) And Not @error Then
For $i In $a_RegExp
If Not $o_Dict.Exists("&#" & $i & ";") Then $o_Dict.Add("&#" & $i & ";", Number($i))
Next
EndIf
; Hexadezimalform:
$a_RegExp = StringRegExp($s_S, "&#x([[:xdigit:]]{2,4});", 3)
If IsArray($a_RegExp) And Not @error Then
For $i In $a_RegExp
If Not $o_Dict.Exists("&#x" & $i & ";") Then $o_Dict.Add("&#x" & $i & ";", Dec($i))
Next
EndIf
; Namensform:
For $i = 0 To 252
$s_T = "&" & $a_NameEnt[$i][0] & ";"
If StringInStr($s_S, $s_T, 2) Then
If Not $o_Dict.Exists($s_T) Then $o_Dict.Add($s_T, $a_NameEnt[$i][1])
EndIf
Next
; Ersetze die Codes durch ihr entsprechendes Zeichen:
For $i In $o_Dict.Keys
$s_S = StringReplace($s_S, $i, ChrW($o_Dict($i)))
Next
EndFunc ;==>_ConvertEntities -
Sorry, da hab ich deine Funktion wohl zu schnell überflogen :(. Die HTML Entitäten werden dadurch selbstverständlich nicht "übersetzt". Lediglich die Umlaute etc. werden korrekt codiert.
-
Vielen Dank schonmal an alle!!
Edit: Funktionierte nicht Denn da war ein blöder Fehler: <font color="#0000FF"> wurde zu <font color="#0000FF"> und deshalb funzte mein Programm nicht!! Aber es funktioniert ja jetzt. Naja, leider ist es nicht schneller durch eure Funktionen, aber es wird kein IE benötigt und die Maus ändert nicht ihren Cursor in den Laden-Cursor.