2009-05-25 3 views
0

Ich versuche, Daten aus der folgenden Seite zu extrahieren:Alternative zu innerhtml, die Header enthält?

http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=&param2=&param3=&param4=&param5=2009-04-22&param6=37#

Which, bequem und ineffektiv genug, die alle Daten als CSV-Datei im Header eingebettet ist, als eine Variable namens gs_csv gesetzt.

Wie extrahiere ich das? Document.body.innerhtml Überspringt die Kopfzeile, wo die Daten sind, was ist die Alternative, die die Kopfzeile enthält (oder besser noch den Wert, der gs_csv zugeordnet ist)?

(Sorry, neu zu all dem, ich habe viele Dokumente durchsucht und viele von ihnen versucht, aber bisher hat noch nichts funktioniert).


Dank Sinan (das ist meist seine Lösung in Python transkribiert).

import win32com.client 

import time 

import os 

import os.path 

ie = Dispatch("InternetExplorer.Application") 

ie.Visible=False 

ie.Navigate("http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=&param2=&param3=&param4=&param5=2009-04-22&param6=37#") 

time.sleep(20) 

webpage=ie.document.body.innerHTML 

s1=ie.document.scripts(1).text 

s1=s1[s1.find("gs_csv")+8:-11] 

scriptfilepath="c:\FO Share\bmreports\script.txt" 

scriptfile = open(scriptfilepath, 'wb') 

scriptfile.write(s1.replace('\n','\n')) 

scriptfile.close() 

ie.quit 
+0

ie.quit (link ausgelassen, da ich ein Neuling bin.) Wenn es hilft, ist dies ein Python-Skript, wie folgt Import win32com.client Importzeit import os Import os.path ie = Dispatch ("InternetExplorer.Application") ie.Visible = True dh .Navigate ("http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=¶m2=¶m3=¶m4=¶m5=2009-04-22¶m6=37#") Zeit. schlafen (20) webpage = ie.document.body # .innerHTML logfilepath = "p: \\ meine Dokumente \\ Python \\ webwipetmp.txt" log_file = open (logfilepath, "wb") log_file.write (Homepage) log_file.close() Seite Druck ie.quit – Brendan

+0

Können Sie eine HTTP-Anfrage machen, bekommen die gesamte Zeichenfolge, und den Header grep? – DonkeyMaster

Antwort

1

Ungeprüfte: Haben Sie versucht, auf der Suche, was Document.scripts enthält?

UPDATE:

Aus irgendeinem Grund Ich habe immense Schwierigkeiten diese immer den Windows Scripting Host arbeiten mit (aber dann, ich es nicht sehr oft verwenden, Entschuldigungen). Wie auch immer, hier ist die Perl-Quelle, die funktioniert:

use strict; 
use warnings; 

use Win32::OLE; 
$Win32::OLE::Warn = 3; 

my $ie = get_ie(); 

$ie->{Visible} = 1; 

$ie->Navigate(
    'http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?' 
    .'param1=&param2=&param3=&param4=&param5=2009-04-22&param6=37#' 
); 

sleep 1 until is_ready($ie); 

my $scripts = $ie->Document->{scripts}; 

for my $script (in $scripts) { 
    print $script->text; 
} 

sub is_ready { $_[0]->{ReadyState} == 4 } 

sub get_ie { 
    Win32::OLE->new('InternetExplorer.Application', 
     sub { $_[0] and $_[0]->Quit }, 
    ); 
} 

__END__ 

C:\Temp> ie > output 

output jetzt enthält alles, was innerhalb des Script-Tags.

+0

Hallo Sinan, Wie gesagt, ich bin völlig neu in all dem. Wenn Sie ie.document.scripts versuchen, wird > zurückgegeben. Wie sollte die Syntax sein? Danke – Brendan

+0

Es ist eine Sammlung: ie.document.scripts.item [0] sollte das erste Skript im Dokument enthalten. Mein IE8 gibt mir Probleme, also kann ich nicht testen. –

+0

ie.document.scripts.item [0] gibt einen Fehler: Typeerror: 'instancemethod' Objekt ist unsubscriptable – Brendan

0

holen Sie die Quelle dieser Seite mit Ajax, und analysieren Sie den Antworttext wie XML mit jquery. Es sollte einfach genug sein, um den Text des ersten Tags, den Sie in der

Ich habe keinen Kontakt zu jquery, oder ich hätte Code-Beispiele gepostet bekommen.

EDIT: Ich nehme an, Sie sprechen über das Abrufen der csv auf der Clientseite.

+0

Es ist eine statische Webseite, also weiß ich nicht, was Ajax damit zu tun hat? Scheint übermäßig kompliziert, konnte ich es aus der vollständigen HTML-Quelle extrahieren, wenn ich wusste, wie man es zurückgibt? – Brendan

0

Wenn dies nur eine einmalige Skript dann diese csv Daten exctracting ist so einfach wie diese:

import urllib2 

response = urllib2.urlopen('http://www.bmreports.com/foo?bar?') 
html = response.read() 
csv = data.split('gs_csv=')[1].split('</SCRIPT>')[0] 

#process csv data here 
+0

Hi randle, Ich sah diese Methode heute Morgen, aber das ist hinter einer Firma Firewall/Proxy mit NTLM-Authentifizierung. Ich habe verschiedene Wege und Beispiele ausprobiert, um Python per Proxy arbeiten zu lassen, aber dann habe ich aufgegeben und dachte, es wäre einfacher, IE zu scannen, um das Dokument zu bekommen. Von dem, was ich gelesen habe, spielen Python und NTLM Proxies nicht zu gut zusammen. Ich nahm an, dass es einige Entsprechung zu innerhtml geben sollte, die das vollständige html zurückgibt, so dachte es wäre schnell und einfach, es auf diese Weise zu tun ... – Brendan

+0

@ Brendan: Sie können NTLMAPS verwenden, um NTLM-Authentifizierung in jeder Anwendung zu umgehen. Es ist in Python geschrieben. http://ntlmaps.sourceforge.net/ – nosklo

+0

nosklo, ntlmaps (soweit ich das sehen kann) ist ein lokaler Proxy, der durch den NTLM-Lan-Proxy routet, muss aber ständig ausgeführt werden, um Anfragen auf localhost von einer anderen Anwendung aus zu stellen . Ich könnte mich irren, aber es ist ein bisschen peinlich und nicht sehr tragbar. – Brendan

0

Dank Sinan (dies meist ist seine Lösung in Python transkribiert).

Import win32com.client

Importzeit import os

Import os.path

ie = Dispatch ("InternetExplorer.Application") ie.Visible = False

ie.Navigate (http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=&param2=&param3=&param4=&param5=2009-04-22&param6=37#)

time.sleep (20)

Webseite = ie.document.body.innerHTML

s1 = ie.document.Skripte (1) .text s1 = s1 [s1.find ("gs_csv") + 8: -11]

scriptfilepath = "c: \ FO Share \ bmreports \ script.txt"

Script = open (scriptfilepath, 'wb')

scriptfile.write (s1.replace ('\ n', '\ n'))

scriptfile.close()

+0

Sie sollten diese Antwort löschen und in Ihrem ursprünglichen Beitrag mit dem richtigen Abschlag einbeziehen (das Fragezeichen neben dem Textfeld zeigt Ihnen, wie Sie unter anderem Code richtig posten). Was die Abstimmung betrifft, ist es kein Problem, wenn Sie nicht AFAIK können, aber Sie sollten zumindest in der Lage sein, die Antwort zu markieren, die Ihr Problem gelöst hat. –