【问题标题】:Alternative to innerhtml that includes header?替代包含标题的innerhtml?
【发布时间】:2010-10-28 17:52:54
【问题描述】:

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

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 关联的值)?

(对不起,这一切都是新手,我一直在搜索大量文档,并尝试了很多,但到目前为止没有任何效果)。


感谢 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

【问题讨论】:

  • (链接省略,因为我是新手。)如果有帮助,这是一个python脚本,如下 import win32com.client import time import os import os.path ie = Dispatch("InternetExplorer .Application") ie.Visible=True ie.Navigate("bmreports.com/servlet/…) time.sleep(20) pages=ie.document.body #.innerHTML logfilepath="p:\\my documents\\Python\\webpagetmp. txt" log_file = open(logfilepath,"wb") log_file.write(webpage) log_file.close() 打印网页ie.quit
  • 你能发出一个 http 请求,获取整个字符串,然后 grep 标头吗?

标签: python html css dom com


【解决方案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 现在包含脚本标签中的所有内容。

【讨论】:

  • 嗨思南,正如我所说,我对这一切完全陌生。尝试 ie.document.scripts 会返回 >。语法应该是什么?谢谢
  • 它是一个集合:ie.document.scripts.item[0] 应该包含文档中的第一个脚本。我的 IE8 出问题了,所以我无法测试。
  • ie.document.scripts.item[0] 给出错误:TypeError: 'instancemethod' object is unsubscriptable
  • 您好思南,非常感谢您的帮助。这完美无缺。对不起,我不能投票给你,看来我没有足够的信誉这样做......:) 无论如何,为了将来参考,Python 中的代码被附加。
【解决方案2】:

使用 ajax 获取该页面的源代码,并使用 jquery 解析响应文本(如 XML)。获取您在

中遇到的第一个标签的文本应该很简单

我与 jquery 脱节,否则我会发布代码示例。

编辑:我假设您正在谈论在客户端获取 csv。

【讨论】:

  • 是静态网页,不知道ajax跟它有什么关系?看起来太复杂了,如果我知道如何返回它,我可以从完整的 HTML 源中提取它吗?
【解决方案3】:

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

【讨论】:

  • 嗨,randle,我今天早上正在研究该方法,但这是来自具有 NTLM 身份验证的公司防火墙/代理。我尝试了几种不同的方法和示例来让 python 通过代理工作,但后来放弃了,并认为编写 IE 脚本来获取文档会更容易。根据我的阅读,Python 和 NTLM 代理不能很好地结合在一起。我认为应该有一些等价于返回完整 html 的 innerhtml,所以认为这样做会既快速又容易......
  • @Brendan:您可以在任何应用程序中使用 NTLMAPS 绕过 NTLM 身份验证。它是用python编写的。 ntlmaps.sourceforge.net
  • nosklo,ntlmaps(据我所知)是一个通过 NTLM Lan 代理进行路由的本地代理,但必须始终运行以在 localhost 上处理来自另一个应用程序的请求。我可能是错的,但它有点尴尬,而且不是很便携。
【解决方案4】:

感谢 Sinan(这主要是他转录成 Python 的解决方案)。

导入 win32com.client

导入时间导入操作系统

导入 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)

网页=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()

即退出

【讨论】:

  • 您应该删除此答案并使用适当的降价将其合并到您的原始帖子中(文本框旁边的问号告诉您如何正确发布代码等)。至于投票给我,如果你不能,但AFAIK,你至少应该能够标记解决你问题的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-24
  • 2019-06-07
相关资源
最近更新 更多