2009-05-25 79 views
0

我想从以下页面提取数据:替代包含标题的innerhtml?

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

其中,方便,效率低下不够,包括嵌入在头一个CSV文件中的所有数据,作为变量称为gs_csv。

我该如何解压? Document.body.innerhtml跳过数据所在的标题,包含标题的备选项(或更好的与gs_csv相关的值)是什么? (对不起,这些都是新鲜事,我一直在搜索大量的文档,并尝试了很多,但目前为止还没有发挥作用)。


感谢思南(这主要是他的解​​决方案转录成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

(链接省略,因为我是一个新手。) 如果有帮助,这是一个Python脚本,如下 进口win32com.client 进口时间 进口OS 进口os.path中 即=调度( “InternetExplorer.Application”) ie.Visible =真 即.Navigate(“http://www.bmreports.com/servlet/com.logica.neta.bwp_PanBMDataServlet?param1=¶m2=¶m3=¶m4=¶m5=2009-04-22¶m6=37#”) 时间。 sleep(20) webpage = ie.document.body#.innerHTML logfilepath =“p:\\ my documents \\ Python \\ webpagetmp.txt” LOG_FILE =开放(LOGFILEPATH, “WB”) log_file.write(网页) log_file.close() 打印网页 ie.quit – Brendan 2009-05-25 13:06:50

+0

你可以做一个HTTP请求,得到整个字符串,和grep头? – DonkeyMaster 2009-05-25 15:45:43

回答

1

未经测试:你尝试看什么Document.scripts包含?

UPDATE:

出于某种原因,我有得到这个使用Windows脚本宿主的工作难度极大(但后来,我不经常用它,道歉)。总之,这里是工作的Perl的来源:

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现在包含脚本标签内的一切。

+0

嗨思南, 正如我所说,我对这一切都是全新的。尝试ie.document.scripts返回>。语法应该是什么? 谢谢 – Brendan 2009-05-25 13:27:59

+0

它是一个集合:ie.document.scripts.item [0]应该在文档中保存第一个脚本。我的IE8给我的问题,所以我无法测试。 – 2009-05-25 14:01:38

+0

ie.document.scripts.item [0]给出了一个错误: TypeError:'instancemethod'对象不可订阅 – Brendan 2009-05-25 14:09:52

0

使用ajax获取该页面的源代码,并使用jquery解析XML之类的响应文本。它应该很简单,足以让你遇到的第一个标签的文本

我与jquery脱节,或者我会张贴代码示例。

编辑:我假设你说的是在客户端获取csv。

+0

这是一个静态网页,所以我不知道ajax与它有什么关系? 似乎过于复杂,我可以从完整的HTML源代码中提取它,如果我知道如何返回它? – Brendan 2009-05-25 13:32:53

0

如果这只是一次性的脚本,然后exctracting这个CSV数据是如此简单:

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

嗨randle, 我今天早上正在看那种方法,但是这是来自公司防火墙/代理与NTLM身份验证。我尝试了几种不同的方法和例子,以通过代理获得python的工作,但后来放弃了,并认为使用IE脚本来获取文档会更容易。从我读过的内容来看,Python和NTLM代理不会一起玩得很好。 我认为应该有一些相当于innerhtml,返回完整的HTML,所以认为这将是快速和容易这样做... – Brendan 2009-05-25 14:09:03

+0

@Brendan:您可以使用NTLMAPS规避NTLM身份验证在任何应用程序。它是用python编写的。 http://ntlmaps.sourceforge.net/ – nosklo 2009-05-25 16:26:51

+0

nosklo,ntlmaps(据我所见)是一个本地代理,它通过NTLM Lan代理进行路由,但必须一直运行到从另一个应用程序到localhost的字段请求。我可能是错的,但它有点尴尬,不便携。 – Brendan 2009-05-26 12:52:36

0

由于思南(这主要是他的解​​决方案转录成Python)。

进口win32com.client

进口时间导入OS

进口os.path中

即=调度( “InternetExplorer.Application”)ie.Visible =假

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)

网页= ie.document.body.innerHTML

s1 = ie.document。脚本(1)的.text S1 = S1 [s1.find( “gs_csv”)+ 8:-11]

scriptfilepath = “C:\ FO共享\ bmreports \ script.txt”

脚本文件=开(scriptfilepath,把wb)

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

scriptfile.close()

ie.quit

+0

你应该删除这个答案,并使用正确的降价将它结合到原始帖子中(文本框旁边的问号告诉你如何正确地发布代码等)。至于投票给我,如果你不能,但没有问题,但你应该至少能够标记解决你的问题的答案。 – 2009-05-25 16:22:25