2

我需要获取此站点的 html 代码(使用 C#):

http://urbs-web.curitiba.pr.gov.br/centro/defmapalinhas.asp?l=n(仅适用于 IE8)

使用 WebClient 类、HttpWebResquest 或任何其他库,我无法访问动态生成的 html 代码。所以我唯一的解决方案(我猜)是使用 WebBrowser Control (WPF)。

在此处输入图像描述

我一直在尝试,使用 mshtml.HTMLDocument 和 SHDocVw.IWebBrowser2 但它一团糟,我找不到我想要的

似乎有很多“iframe”,里面有更多的“iframe”。我不知道,我试过:

  IHTMLElementCollection elcol = htmlDoc.getElementsByTagName("iframe");
  var test = htmlDoc.getElementsByTagName("HTML");
  var test2 = doc.all;

但没有进展,有人知道如何帮助我吗?

观察/琐事:这是显示所有公共汽车在我的城市经过的站点。这个网站太可怕了,而且只在 IE8 下工作有严重的问题。我想使用这些信息来尝试创建更好的服务,使用谷歌地图或 bing 地图。

我试图获取信息的站点不再可用,获取动态 html 源代码的想法被放弃,我找不到使用 WebBrowser Control for WPF 的解决方案。

我相信今天还有其他方法可以解决这个问题。

4

1 回答 1

1

您需要在 WebBrowser 控件中使用“Frames”对象,如果我没记错的话,此对象集合将返回所有框架和 iframe,并且您需要查看在页面上找到的每个新发现的框架的框架集合,请告诉我? 因此,这就像一个需要运行的递归发现循环,将找到的每个帧添加到数组或集合中,并且对于每个“未搜索”帧,您必须查看该帧“.Frames”集合(它们都将具有.Count 等,只是一个典型的集合),并且您对找到的每个新发现的框架都执行此操作,直到当然,不再有任何新发现的框架尚未搜索其“.Frames”集合。

因此,如果按照上述方法完成该功能,将允许发现无限嵌套的帧,正如我在 VB6 项目中所做的那样(如果您愿意,我很乐意为您提供它的源代码)。但是,在我的示例中没有保留嵌套,但这没关系,因为嵌套结构并不重要,您应该根据添加到集合中的帧的顺序找出哪个是什么,因为顺序与添加的框架的层次结构。

一旦你这样做了,获取 html 源代码就非常简单了,我相信你知道该怎么做,可能是一个 .DocumentText,具体取决于你使用的 WB 控件的版本。

还有,你说不能用HTTP客户端直接抓取源码吗?我必须不同意,因为一旦有了框架对象,就可以从每个框架对象中获取 URL,并执行 URL2String 类型调用以获取 URL 并将其从任何类似 httpclient 的类或框架中转换为字符串。如果他们只接受来自特定推荐人的请求(即:推荐人必须来自他们的某些文件等的域名),或者如果它不是其中之一的 USER_AGENT指定的浏览器,那么从技术上讲,它们可能会拒绝并且不返回数据,这不太可能但可能。

但是,referrer 和 user_agent 都可以在您使用的 httpclient 中进行更改,因此如果他们基于此类内容施加限制,您可以很容易地欺骗他们并为他们提供他们期望的数据。再一次,这是低概率的东西,但他们可能已经以这种方式进行设置,特别是如果他们的数据是专有的。

PS:我第一次访问该站点时,IE 崩溃并重新打开该选项卡 :),我同意这个糟糕的站点。

于 2012-10-02T00:58:44.787 回答