WebBrowser HtmlElement.GetAttribute("href") 前缀主机名
WebBrowser HtmlElement.GetAttribute("href") prepending hostname
我的 Windows Forms 应用程序托管一个 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
属性的文字值?我可以指望这种行为吗?这个 "feature" 有记载吗? (我自己在基础 URL 之前,但这给了我像 http://lts930411http://lts930411/A/a150923a.lts
这样的地址。如果我能找到保证这将永远发生的文档,我可以期待完整的 URL .)
试试这个代码:
foreach (HtmlElement el in anchors)
{
string href = System.IO.Path.GetFileName(el.GetAttribute("href"));
...
}
如 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();
以上代码,returns 未修改文档中所有 a
标签的 href
属性值。
我的 Windows Forms 应用程序托管一个 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
属性的文字值?我可以指望这种行为吗?这个 "feature" 有记载吗? (我自己在基础 URL 之前,但这给了我像 http://lts930411http://lts930411/A/a150923a.lts
这样的地址。如果我能找到保证这将永远发生的文档,我可以期待完整的 URL .)
试试这个代码:
foreach (HtmlElement el in anchors)
{
string href = System.IO.Path.GetFileName(el.GetAttribute("href"));
...
}
如 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();
以上代码,returns 未修改文档中所有 a
标签的 href
属性值。