我需要通过 URL 创建时事通讯。为此,我:
- 创建一个
WebClient
. - 使用WebClient的方法
DownloadData
获取字节数组中的页面源; - 从 source-html 字节数组中获取字符串并将其设置为时事通讯内容。
但是,我在路径方面遇到了一些麻烦。所有元素的来源都是相对的(/img/welcome.png
),但我需要一个绝对的来源,例如http://www.example.com/img/welcome.png。
我怎样才能做到这一点?
我需要通过 URL 创建时事通讯。为此,我:
WebClient
.DownloadData
获取字节数组中的页面源;但是,我在路径方面遇到了一些麻烦。所有元素的来源都是相对的(/img/welcome.png
),但我需要一个绝对的来源,例如http://www.example.com/img/welcome.png。
我怎样才能做到这一点?
解决此任务的一种可能方法是使用HtmlAgilityPack库。
一些例子(修复链接):
WebClient client = new WebClient();
byte[] requestHTML = client.DownloadData(sourceUrl);
string sourceHTML = new UTF8Encoding().GetString(requestHTML);
HtmlDocument htmlDoc = new HtmlDocument();
htmlDoc.LoadHtml(sourceHTML);
foreach (HtmlNode link in htmlDoc.DocumentNode.SelectNodes("//a[@href]"))
{
if (!string.IsNullOrEmpty(link.Attributes["href"].Value))
{
HtmlAttribute att = link.Attributes["href"];
att.Value = this.AbsoluteUrlByRelative(att.Value);
}
}
如果请求来自您的站点(相同的域链接),那么您可以使用它:
new Uri(Request.Uri, "/img/welcome.png").ToString();
如果您使用的是非网络应用程序,或者您想对域名进行硬编码:
new Uri("http://www.mysite.com", "/img/welcome.png").ToString();
你有一些选择:
Console.Write(ControlChars.Cr + "请输入一个Url(例如http://www.msn.com):") 将 remoteUrl 调暗为 String = Console.ReadLine() 将 myWebClient 调暗为新 WebClient() Console.WriteLine(("正在下载" + remoteUrl)) 将 myDatabuffer 调暗为 Byte() = myWebClient.DownloadData(remoteUrl) 暗淡下载 As String = Encoding.ASCII.GetString(myDataBuffer) download.Replace("src=""/", "src=""" & remoteUrl & "/") download.Replace("href=""/", "href=""" & remoteUrl & "/") Console.WriteLine(下载) Console.WriteLine("下载成功。")
这是超级做作的,实际上它的主要冲击直接来自: http: //msdn.microsoft.com/en-us/library/xz398a3f.aspx,但它说明了方法 1 背后的基本原理。
只需使用此功能
'# converts relative URL ro Absolute URI
Function RelativeToAbsoluteUrl(ByVal baseURI As Uri, ByVal RelativeUrl As String) As Uri
' get action tags, relative or absolute
Dim uriReturn As Uri = New Uri(RelativeUrl, UriKind.RelativeOrAbsolute)
' Make it absolute if it's relative
If Not uriReturn.IsAbsoluteUri Then
Dim baseUrl As Uri = baseURI
uriReturn = New Uri(baseUrl, uriReturn)
End If
Return uriReturn
End Function
您可以尝试使用 href-attrib = 有问题的原始 baseURI 设置基本元素,而不是解析/完成相对路径。
作为标题元素的第一个子元素,浏览器应解析所有以下相对路径以指向原始目的地,而不是文档(时事通讯)所在/来自的位置。
在 Firefox 上,所有 src/href-attribs 的获取/设置的一些重言式(<-informal logics)来回恢复将完整路径写入 html-doc 的所有层(序列化),因此可编写脚本,可保存...:
var d=document;
var n= d.querySelectorAll('[src]'); // do the same for [href] ...
var i=0; var op ="";var ops="";
for (i=0;i<n.length;i++){op = op + n[i].src + "\n";ops=n[i].src;
n[i].src=ops;}
alert(op);
当然,在 STYLE-Element(s, - for background-img 或 content-rules) 以及在节点级别的样式属性中给出的 url()-func 基础,特别是 url()-func - 声明的 src/href-values 不被上述任何解决方案考虑/测试。
因此,让 base-Elem 方法进入一个有效的、经过测试的(兼容列表)状态,对我来说似乎是更有希望的想法。