Относительно абсолютных путей в HTML (asp.net) - PullRequest
7 голосов
/ 27 апреля 2010

Мне нужно создать рассылку по URL.Чтобы сделать следующее:

  1. Создать WebClient;
  2. Используйте метод DownloadData WebClient для получения источника страницы в байтовом массиве;
  3. Получить строку из source-htmlбайтовый массив и установите его для содержимого бюллетеня.

Но у меня есть некоторые проблемы с путями.Источники всех элементов были относительными ( / img / welcome.png ), но мне нужен абсолютный (http://www.mysite.com/img/welcome.png).

Как я могу это сделать?

BestС уважением, Алекс.

Ответы [ 5 ]

6 голосов
/ 27 апреля 2010

Одним из возможных способов решения этой задачи является использование библиотеки 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);
    }
}
2 голосов
/ 27 апреля 2010

если запрос приходит с вашего сайта (те же ссылки домена), то вы можете использовать это:

new Uri(Request.Uri, "/img/welcome.png").ToString();

Если вы не в веб-приложении или хотите жестко закодировать доменное имя:

new Uri("http://www.mysite.com", "/img/welcome.png").ToString();
0 голосов
/ 27 августа 2013

Вместо того, чтобы разрешать / завершать относительные пути, вы можете попытаться установить базовый элемент с помощью href-attrib = исходного baseURI, о котором идет речь.

Помещенный как первый дочерний элемент элемента заголовка, все следующие относительные пути должны быть разрешены браузером, чтобы указывать на исходное место назначения, а не на то, откуда находится документ / информационный бюллетень.

на firefox, некоторые тавтологические (<- в формальной логике) туда-сюда при получении / установке всех src / href-attribs возобновляют запись завершенных путей во все слои (сериализованные) html-doc, таким образом сохраняемый в сценарии, сохраняемый ...: </p>

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

Конечно, url () - основы func, как указано в STYLE-элементе (s, - для background-img или content-rules), а также в style-attrib на уровне узла и, в частности, в url ( ) -func-указанные значения src / href-значения НЕ рассматриваются и не проверяются ни одним из приведенных выше решений.

Поэтому, чтобы получить подход базового элемента к действительному, проверенному (compat-list) состоянию, мне кажется более перспективным понятие.

0 голосов
/ 21 августа 2011

Просто используйте эту функцию

'# 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
0 голосов
/ 27 апреля 2010

У вас есть несколько вариантов:

  1. Вы можете преобразовать свой байтовый массив в строку и найти замену.
  2. Вы можете создать объект DOM, преобразовать байтовый массив в строку,загрузите его и добавьте значение к атрибутам, где это необходимо (в основном вы ищете любой атрибут src, href, в котором нет http: или https:).
    Console.Write(ControlChars.Cr + "Please enter a Url(for example, http://www.msn.com): ")
    Dim remoteUrl As String = Console.ReadLine()
    Dim myWebClient As New WebClient()
    Console.WriteLine(("Downloading " + remoteUrl))
    Dim myDatabuffer As Byte() = myWebClient.DownloadData(remoteUrl)
    Dim download As String = Encoding.ASCII.GetString(myDataBuffer)
    download.Replace("src=""/", "src=""" & remoteUrl & "/")
    download.Replace("href=""/", "href=""" & remoteUrl & "/")
    Console.WriteLine(download)
    Console.WriteLine("Download successful.")

Этосупер надуманный и фактически главный удар по нему взят непосредственно из: http://msdn.microsoft.com/en-us/library/xz398a3f.aspx, но он иллюстрирует основной принцип, лежащий в основе метода 1.

...