包含头部的innerHTML替代方案?

0 投票
4 回答
1419 浏览
提问于 2025-04-15 11:49

我正在尝试从以下页面提取数据:

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

这个页面很方便,但效率不高,所有的数据都嵌入在页面的头部,作为一个叫做 gs_csv 的变量存在。

我该如何提取这些数据呢?使用 Document.body.innerhtml 的话,会跳过包含数据的头部,有没有其他方法可以获取头部的内容(或者更好的是,直接获取 gs_csv 变量的值)?

(抱歉,我对这些都很陌生,查阅了很多文档,尝试了很多方法,但到目前为止都没有成功)。


感谢 Sinan(这主要是他的解决方案转写成 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

4 个回答

0

如果这只是一个一次性的脚本,那么提取这个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

用ajax获取那个页面的内容,然后用jquery把返回的文本当成XML来解析。其实很简单,你可以很容易地找到第一个遇到的标签里的文本。

我对jquery有点生疏,要不然我会发一些代码示例。

补充:我假设你是在说在客户端获取csv文件。

1

未经测试:你有没有试着看看 Document.scripts 里面有什么内容?

更新:

出于某种原因,我在使用 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 现在包含了所有在脚本标签内的内容。

撰写回答