2009-05-25 7 views
0

Je suis en train d'extraire des données à partir de la page suivante:Alternative à innerhtml qui inclut l'en-tête?

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

qui, commodément et assez inefficacement, comprend toutes les données intégrées dans un fichier csv dans l'en-tête, défini comme variable appelée gs_csv.

Comment l'extraire? Document.body.innerhtml ignore l'en-tête où les données sont, quelle est l'alternative qui inclut l'en-tête (ou mieux encore, la valeur associée à gs_csv)?

(désolé, nouveau à tout cela, j'ai été la recherche à travers des tas de documentation, et en essayant beaucoup d'entre eux, mais rien n'a fonctionné jusqu'à présent).


Merci à Sinan (c'est principalement sa solution transcrite en Python).

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

(lien omis, car je suis un débutant.) Si elle aide, ceci est un script python, comme suit importation win32com.client temps import import os importation os.path ie = Dispatch ("InternetExplorer.Application") ie.Visible = True -à-dire .Navigate ("http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=¶m2=¶m3=¶m4=¶m5=2009-04-22¶m6=37#") temps. sleep (20) webpage = ie.document.body # .innerHTML logfilepath = "p: \\ mes documents \\ Python \\ webpagetmp.txt" log_file = ouvert (LogFilePath, "wb") log_file.write (page web) log_file.close() page web d'impression ie.quit – Brendan

+0

Pouvez-vous faire une demande http, obtenir toute la chaîne, et grep les en-têtes? – DonkeyMaster

Répondre

1

Untested: Avez-vous essayé regarder ce Document.scripts contient?

MISE À JOUR:

Pour une raison quelconque, j'ai immense difficulté à obtenir que cela fonctionne en utilisant le Windows Scripting Host (mais, je ne l'utilise pas très souvent, des excuses). Quoi qu'il en soit, voici la source Perl qui fonctionne:

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 contient maintenant tout dans les balises de script.

+0

Salut Sinan, Comme je l'ai dit, je suis complètement nouveau à tout cela. Essayer ie.document.scripts renvoie >. Quelle devrait être la syntaxe? Merci – Brendan

+0

Il s'agit d'une collection: ie.document.scripts.item [0] doit contenir le premier script dans le document. Mon IE8 me donne des problèmes, donc je ne peux pas tester. –

+0

ie.document.scripts.item [0] donne une erreur: TypeError: objet 'instancemethod' est unsubscriptable – Brendan

0

récupère la source de cette page en utilisant ajax, et analyse le texte de réponse comme XML en utilisant jquery. Il devrait être assez simple pour obtenir le texte de la première étiquette que vous rencontrez dans le

Je ne suis pas en contact avec jquery, ou j'aurais posté des exemples de code.

EDIT: Je suppose que vous parlez d'aller chercher le csv du côté client.

+0

C'est une page web statique, donc je ne sais pas ce que ajax a à voir avec ça? Semble trop compliqué, je pourrais l'extraire de la source HTML complète si je savais comment le retourner? – Brendan

0

Si cela est juste un scénario de exctracting ensuite ces données csv est aussi simple que cela:

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

Salut randle, Je regardais cette méthode ce matin, mais c'est derrière un pare-feu d'entreprise/proxy avec l'authentification NTLM. J'ai essayé plusieurs méthodes et exemples pour faire fonctionner python par proxy, mais j'ai abandonné et j'ai pensé qu'il serait plus facile de scripter IE pour obtenir le document. D'après ce que j'ai lu, les proxys Python et NTLM ne jouent pas trop bien ensemble. J'ai supposé qu'il devrait y avoir un équivalent à innerhtml qui renvoie le html complet, donc pensé qu'il serait rapide et facile de le faire de cette façon ... – Brendan

+0

@Brendan: Vous pouvez utiliser NTLMAPS pour contourner l'authentification NTLM dans toute application. Il est écrit en python. http://ntlmaps.sourceforge.net/ – nosklo

+0

nosklo, ntlmaps (pour autant que je puisse le voir) est un proxy local qui achemine via le proxy NTLM Lan, mais doit être exécuté tout le temps pour traiter les requêtes sur localhost à partir d'une autre application . Je peux me tromper, mais c'est un peu gênant, et pas très portable. – Brendan

0

Merci à Sinan (ce qui est le plus souvent sa solution transcrit en Python).

importation win32com.client

temps import import os

importation 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"

fichierscript = open (scriptfilepath, 'wb')

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

scriptfile.close()

ie.quit

+0

Vous devez supprimer cette réponse et l'incorporer dans votre message d'origine en utilisant la marque appropriée (le point d'interrogation à côté de la zone de texte vous indique comment correctement publier le code, entre autres choses). Quant à me faire voter, ce n'est pas un problème si vous ne pouvez pas, mais je pense que vous devriez au moins être en mesure de marquer la réponse qui a résolu votre problème. –