如何使用Web浏览器在使用JavaScript编写的网页中获取超链接

时间:2012-12-20 03:38:13

标签: c# javascript html hyperlink webbrowser-control

webBrowser1.Navigate(myurl); 
HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("HTML");
foreach (HtmlElement link in links)
{
MessageBox.Show(link.InnerHtml);         
}

我使用上面的代码并且可以获取网页的整个HTML文档,但我真正想要的是在HTML文档中获取超链接url(url as(“a href”))。

我用:

MessageBox.Show(link.GetAttribute("href"));

但它返回null。

有人可以帮助我解决问题不使用正则表达式但是使用简单函数之类的东西吗?

使用JavaScript的HTML代码如下所示:

<HTML>
<HEAD>
<TITLE>Test for me</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
<SCRIPT LANGUAGE="JavaScript">
<!--


function window::onload()
{

 result.innerHTML = 
      "<br><center><font size=+1><a href='MyMain.aspx' target='_parent'>Back to My Main        Page</a></font><br>"
    + "<font size=+2><b><a href='http://MySub.asp'>Launch My Application</a></b></font></center>";     
}

-->
</SCRIPT>
</HEAD>

<BODY>
<div id="result" />
</BODY>
</HTML>

1 个答案:

答案 0 :(得分:1)

这几乎是一个完整的猜测,但是:

  • 你可能要等到文件实际上 在获取内容之前加载
  • 你需要抓住权利 内容(“A”标签)

继续http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.documentcompleted.aspx,我猜以下代码可能有效:

首先,设置一个事件处理程序:

// Add an event handler that processes the document after it loads.
webBrowser1.DocumentCompleted +=
    new WebBrowserDocumentCompletedEventHandler(ProcessDocument);

在别处,定义处理程序(以及需要发生的事情)

private void ProcessDocument(object sender,
    WebBrowserDocumentCompletedEventArgs e)
{

    var webBrowser1 = (WebBrowser)sender;

    HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("A");
    foreach (HtmlElement link in links)
    {
        MessageBox.Show(link.GetAttribute("href"));         
    }

}

最后:

webBrowser1.Navigate(myurl); 

问题是,msdn文档没有说明在文档“完全加载”之前必须发生什么。

编辑:我终于在LinqPad中尝试了它,并且看起来它不会暴露与“窗口加载”事件有关的任何事情,至少直接。我打算将DocumentCompleted事件更像是一个“DOMReady”事件。以下是一个hack,但它出现在DocumentTitleChange事件的第三次调用,它抓取href的内容。请注意第三次调用它的原因是我有更改标题的javascript

void Main()
{
    WebBrowser webBrowser1 = new WebBrowser();
    webBrowser1.DocumentTitleChanged +=
        new EventHandler(ProcessDocument);
    webBrowser1.Navigate("http://localhost/test/test.html"); 

    Console.ReadLine();
}

// Define other methods and classes here

private void ProcessDocument(object sender,
    EventArgs e)
{

    var webBrowser1 = (WebBrowser)sender;
    Console.WriteLine("ProcessDocument BEGIN");
    HtmlElementCollection links = webBrowser1.Document.GetElementsByTagName("A");
    foreach (HtmlElement link in links)
    {
        Console.WriteLine(link.GetAttribute("href"));         
    }
    Console.WriteLine("ProcessDocument END");
    Console.Out.Flush();

}

你的html在哪里:

<HTML>
<HEAD>
<TITLE>Test for me</TITLE>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8" />
<SCRIPT LANGUAGE="JavaScript">
<!--


function foo()
{
  var result = document.getElementById('result');
 result.innerHTML = 
      "<br><center><font size=+1><a href='MyMain.aspx' target='_parent'>Back to My Main        Page</a></font><br>"
    + "<font size=+2><b><a href='http://MySub.asp'>Launch My Application</a></b></font></center>";
  document.title += "Hack..Aacklgahala, ribbit";    
}

-->
</SCRIPT>
</HEAD>

<BODY onload="foo()">
<a href="http://google.com">bar</a>
<div id="result" />
</BODY>
</HTML>