如何在WebBrowser控件中获取页面标题?

12

当我导航到不同的网站时,如何在WebBrowser控件中获取页面标题?


xmlns

xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"

以D开头的属性

DataContext
DesiredSize
Dispatcher
DoubleTap
标签
<phone:WebBrowser Name="browser" Height="760" VerticalAlignment="Top"></phone:WebBrowser>
6个回答

9
我有同样的问题。@Akash Kava的回答几乎是正确的,但这是正确的JavaScript代码来读取HTML标题:
String title = (string)browser.InvokeScript("eval", "document.title.toString()");

正如David所说,为了正常工作,必须在WebBrowser.LoadCompleted事件处理程序中调用它。此外,由于这是在事件处理程序中执行的,因此如果正在更新UI,则应在WPF的Control.Invoke或Silverlight / Windows Phone的Dispatcher.Invoke的操作中调用上述代码。 - Ben

2
对我来说,以下代码有效。@Akash和@Mikko的答案让我找到了正确的方向,但我在一些网站上仍然遇到了一些问题。据我所了解,问题在于当WebBrowser组件开始从远程服务器获取数据时,会触发Navigated事件。因此,DOM对象尚未完全创建,调用document.title会抛出错误。所以我只需在几毫秒后重试,直到获取标题为止。这个“循环”从未在我测试过的任何网站上迭代超过3次,并且每次都无缺地带给我标题。
private void webBrowser1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
{
    ThreadPool.QueueUserWorkItem(UpdateText);
}

private void UpdateText(object o)
{
    Thread.Sleep(100);
    Dispatcher.BeginInvoke(() =>
    {
        try
        {
            textBlock1.Text = webBrowser1.InvokeScript("eval", "document.title").ToString();
        }
        catch (SystemException)
        {
            ThreadPool.QueueUserWorkItem(UpdateText);
        }
    });
}

1

我非常确定

String title = browser.Document.Title;

这个应该能解决问题。

请点击这里查看。


以D开头的属性:DataContext、DesiredSize、Dispatcher、DoubleTap(Microsoft.Phone.Controls)。xaml标签:<phone:WebBrowser Name="browser" Height="760" VerticalAlignment="Top"></phone:WebBrowser>。 - BrunoLM
1
抱歉,我想到的是常规的Forms WebBrowser控件。您尝试过@Akash Kava的答案,但将“IsScriptEnabled”属性设置为“true”吗? - Sid Holland

1

所有答案都不是100%正确的:

你必须在浏览器的LoadCompleted事件中调用以下内容:

String title = (string)browser.InvokeScript("eval", "document.title.toString()");

而不是在navigated事件中。


0

您可以使用InvokeScript来获取标题,如下:

 String title = browser.InvokeScript("document.title");

我不确定是否正确,但你也可以尝试使用 window.title。


我在 LoadCompleted 事件上尝试了一下,但它抛出了一个未知的异常。 - BrunoLM
您必须按照 MSDN 文档启用脚本,而且此方法只能在文档加载后调用,因此如果文档尚未准备好,您必须等待一段时间。 - Akash Kava
1
我尝试在接收到“Navigated”事件时调用它,但是出现了一个异常,显示“错误:80020006”。是的,我的XAML中有IsScriptEnabled="True"。 - tronman

0
以下代码对我有效,注意到了 navigated 事件,如果你使用 loaded 事件,它会在页面加载之前触发,你需要在页面完全加载后的某个时间点触发,navigated 事件就像是那个事件。
private void web1_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        //Added thread using "using System.Thread", to act as a buffer for any page delay.
        Thread.Sleep(2000);
        String title = (string)web1.InvokeScript("eval", "document.title");
        PageTitle.Text = title;

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接