我有一个ASP.NET页面和一些用于获取指定网页的自定义类,并返回此页面主体。
protected String GetHtml()
{
Thread thread = new Thread(new ThreadStart(GetHtmlWorker));
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();
return docHtml;
}
protected void GetHtmlWorker()
{
using (WebBrowser browser = new WebBrowser())
{
browser.ScriptErrorsSuppressed = true;
browser.Navigate(_url);
// Wait for control to load page
while (browser.ReadyState != WebBrowserReadyState.Complete)
Application.DoEvents();
docHtml = browser.DocumentText;
}
但我需要的是 - 它获取DOM html而不是源代码。因为我通过jQuery对DOM进行了一些额外的操作。
答案 0 :(得分:16)
这是我在javascript运行后找到的渲染HTML(DOM)的一个解决方案:
将一个名为webBrowser1的WebBrowser控件放在Form1类的Form上。
[Form1.cs的[设计]]
然后代码使用:
[Form1.cs中]
using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;
namespace WebBrowserTest
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.webBrowser1.ObjectForScripting = new MyScript();
}
private void Form1_Load(object sender, EventArgs e)
{
webBrowser1.Navigate("http://localhost:6489/Default.aspx");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
webBrowser1.Navigate("javascript: window.external.CallServerSideCode();");
}
[ComVisible(true)]
public class MyScript
{
public void CallServerSideCode()
{
var doc = ((Form1)Application.OpenForms[0]).webBrowser1.Document;
}
}
}
}
将Form1_Load中的webBrowser1.Navigate(“http://localhost:6489/Default.aspx”)参数更改为您希望获取的javascript处理后的DOM页面。
您可以在CallServerSideCode()方法中访问修改后的DOM,例如:
doc.GetElementById("myDataTable");
或者您可以像这样访问呈现的HTML:
var renderedHtml = doc.GetElementsByTagName("HTML")[0].OuterHtml;
答案 1 :(得分:6)
正如乔治在其中一篇评论中所说的那样,理论上你只需使用以下内容即可获得webBrowser1_DocumentCompleted中的DOM:
webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml;
答案 2 :(得分:2)
首先是一点背景。我一直试图从网页上抓取信息。该网页的内容是动态的。我的意思是动态是当您向下滚动到页面底部时,网页会加载更多信息。滚动到页面底部时,HTML内容会发生变化。遗憾的是,Web浏览器对象不会自动更新此信息。它仍然具有首先通过webbrowser.navigate
函数加载的原始文档。更新后的信息可供HTMLElementCollection
。
以下代码对我不起作用。
webBrowser1.Document.GetElementsByTagName("HTML")[0].OuterHtml
我将上述声明分解如下
Dim eCollections As HtmlElementCollection
Dim strDoc As String
eCollections = WB.Document.GetElementsByTagName("HTML")
strDoc = eCollections(0).OuterHtml
像魅力一样工作。希望这对某人也有帮助。
答案 3 :(得分:0)
另一种方法是在表单上设置一个计时器,然后当计时器点击时,页面将重新呈现,你可以解析页面。
答案 4 :(得分:-1)
你可以
webBrowser1.Document.Body.OuterHtml