来自iframe的完整HTML代码,使用webbrowser

时间:2012-10-01 16:02:39

标签: c# webbrowser-control mshtml

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

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

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

enter image description here

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

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

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

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

观察/琐事:这是显示我所在城市所有公共汽车通行证的网站。这个网站很可怕,只在IE8中运行有严重的问题。我想利用这些信息尝试创建一个更好的服务,使用谷歌地图或后面的地图。

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

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

1 个答案:

答案 0 :(得分:1)

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

因此,如果按照上面的方式完成,该函数将允许发现无限嵌套的帧,因为我已经在VB6项目中完成了这项工作(如果您愿意,我很乐意为您提供源代码)它)。但是,在我的示例中没有保留嵌套,但是没关系,因为嵌套结构并不重要,您应该确定哪个是按照添加到集合的帧的顺序,因为订单与正在添加的帧的层次结构。

一旦你这样做,获取html源代码非常简单,我确定你知道怎么做,可能是一个.DocumentText,取决于你正在使用的WB控件的版本。

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

但是,你可以在你正在使用的httpclient中更改referrer和user_agent,所以如果他们根据这种东西强加限制,你可以很容易地欺骗它们并为它们提供他们期望的数据。再次,这是低概率的东西,但他们可能已经设置了这种方式,特别是如果他们的数据是专有的。

PS:我第一次访问该网站最终导致IE崩溃并重新打开该标签:),糟糕的网站我同意。