使用 Web 浏览器文档文本的 C#,文档保持空
本文关键字:文档 Web 浏览器 文本 使用 | 更新日期: 2023-09-27 18:37:10
我希望标题足够清楚,但我会尝试解释...
我正在使用C# Winforms(dotnet 4.5)。
问题是我正在创建一个 WebBrowser 控件并尝试使用 wb.DocumentText
设置内容。但是当我尝试遍历元素时,它说文档是空的(空)
这是我的代码:
WebBrowser wb = new WebBrowser();
wb.DocumentText = leMessage;
HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in elems)
{
// Do Some Stuff
}
leMessage
保存HTML时事通讯消息,其中有一些标签。
我已经尝试过这个:wb.Document.Body.InnerHtml = leMessage;
但这也不起作用...
我错过了什么或做错了什么?
WebBrowser.DocumentText
是异步的。您需要先处理DocumentComplete
,然后才能访问 DOM,并继续抽取 Windows 消息。下面是一个完整的网络抓取示例,使用 async/await
来保持方便的线性代码流。只需更改导航部分:
await NavigateAsync(ct, () => this.webBrowser.DocumentText = leMessage), timeout);
HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
这样,您就可以循环使用。简而言之:
using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace WinformsApp2
{
public partial class MainForm : Form
{
public MainForm()
{
InitializeComponent();
}
const string leMessage = "<a href='http://example.com'>Go there</a>";
private async void MainForm_Load(object sender, EventArgs e)
{
var wb = new WebBrowser();
TaskCompletionSource<bool> tcs = null;
WebBrowserDocumentCompletedEventHandler documentCompletedHandler = (sender2, e2) => tcs.TrySetResult(true);
for (int i = 0; i < 3; i++)
{
tcs = new TaskCompletionSource<bool>();
wb.DocumentCompleted += documentCompletedHandler;
try {
wb.DocumentText = leMessage;
await tcs.Task;
}
finally {
wb.DocumentCompleted -= documentCompletedHandler;
}
HtmlElementCollection elems = wb.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in elems)
{
Debug.Print(elem.OuterHtml);
}
}
}
}
}
您需要在
触发事件webBrowser1_DocumentCompleted
后循环元素。因此,您需要将其包含在代码中
webBrowser1.DocumentCompleted+=new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
private void webBrowser1_DocumentCompleted(object sender,WebBrowserDocumentCompletedEventArgs e)
{
//here you can to loop your elements
}
试试这个:
WebBrowser wb;
private void Form1_Load(object sender, EventArgs e)
{
wb = new WebBrowser();
wb.DocumentCompleted += wb_DocumentCompleted;
wb.DocumentText = "<html><body><a href='#'>Test</a></body></html>";
}
void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
HtmlElementCollection elems = ((WebBrowser)sender)
.Document.GetElementsByTagName("a");
foreach (HtmlElement elem in elems)
{
// Do Some Stuff
}
}