winforms Web浏览器HtmlElement.GetAttribute(“href”)前置主机名

goucqfw6  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(97)

我的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属性的文本值?这种行为我可以信赖吗?这种“特性”在哪里有文档记录吗?(我自己在前面加上了基本URL,但这给了我像http://lts930411http://lts930411/A/a150923a.lts这样的地址。如果我能找到承诺这将永远发生的文档,我可以只期待完整的URL。)

kognpnkq

kognpnkq1#

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();

上面的代码返回文档中所有a标记的未触及href属性值。

cgyqldqp

cgyqldqp2#

请尝试以下代码:

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

mklgxw1f3#

首次引用Microsoft.mshtml

using mshtml;      
   var allTagA =  webBrowser1.Document.GetElementsByTagName("a");
   foreach (HtmlElement item in allTagA )
    {
        string href = ((HTMLAnchorElement)item.DomElement).href;
    }

相关问题