繁体   English   中英

WebBrowser HtmlElement.GetAttribute(“href”)预先添加主机名

[英]WebBrowser HtmlElement.GetAttribute(“href”) prepending hostname

我的Windows窗体应用程序托管一个WebBrowser控件,该控件显示一个充满链接的页面。 我正在尝试在加载的HtmlDocument找到所有锚元素并读取它们的href属性,以便我可以在C#中提供多文件下载界面。 下面是我找到并处理锚元素的函数的简化版本:

public void ListAnchors(string baseUrl, HtmlDocument doc) // doc is retrieved from webBrowser.Document
{
    HtmlElementCollection anchors = doc.GetElementsByTagName("a");
    foreach (HtmlElement el in anchors)
    {
        string href = el.GetAttribute("href");
        Debug.WriteLine("el.Parent.InnerHtml = " + el.Parent.InnerHtml);
        Debug.WriteLine("el.GetAttribute(\"href\") = " + href);
    }
}

锚标签全部被<PRE>标签包围。 我正在加载HTML的主机名是网络上的本地计算机(lts930411)。 一个条目的源HTML如下所示:

<PRE><A href="/A/a150923a.lts">a150923a.lts</A></PRE>

一个锚元素的上述C#代码的输出是这样的:

el.Parent.InnerHtml = <A href="/A/a150923a.lts">a150923a.lts</A>

el.GetAttribute("href") = http://lts930411/A/a150923a.lts

为什么el.GetAttribute("href")添加方案和主机名前缀( http://lts930411 )而不是从源HTML返回href属性的文字值? 我可以指望这种行为吗? 这个“功能”是否记录在某处? (我自己在预先添加了基本网址,但这给了我一些地址,如http://lts930411http://lts930411/A/a150923a.lts 。如果我能找到有希望这样做的文档,我会http://lts930411http://lts930411/A/a150923a.lts期待完整的网址永远都会发生。)

IHTMLAnchorElement.href文档中所述,相对URL将根据包含a元素的文档的位置进行解析。

作为获取未触及的href属性值的选项,您可以使用以下代码:

var expression = "href=\"(.*)\"";
var list = document.GetElementsByTagName("a")
                   .Cast<HtmlElement>()
                   .Where(x => Regex.IsMatch(x.OuterHtml, expression))
                   .Select(x => Regex.Match(x.OuterHtml, expression).Groups[1].Value)
                   .ToList();

上面的代码,返回不变href所有的属性值a文档中的标签。

试试这段代码:

    foreach (HtmlElement el in anchors)
        {
            string href = System.IO.Path.GetFileName(el.GetAttribute("href"));
            ...
        }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM