2010-04-27 17 views
7

Necesito crear un boletín de noticias por URL. Debo hacer lo siguiente:Relativo a las rutas absolutas en HTML (asp.net)

  1. Crear un WebClient;
  2. Utilice el método WebClient DownloadData para obtener una fuente de la página en la matriz de bytes;
  3. Obtiene la cadena del conjunto de origen-html byte y configúrelo en el contenido del boletín .

Pero tengo algunos problemas con las rutas. Todas las fuentes de elementos fueron relativas (/img/welcome.png) pero necesito absoluta (http://www.mysite.com/img/welcome.png).

¿Cómo puedo hacer esto?

Saludos cordiales, Alex.

Respuesta

6

Una de las formas posibles de resolver esta tarea es utilizar la biblioteca HtmlAgilityPack.

Algunos ejemplos (enlaces fijos):

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); 
    } 
} 
+3

Mi script no encuentra esto.AbsoluteUrlByRelative – ram4nd

0

usted tiene algunas opciones:

  1. Puede convertir la matriz de bytes en una cadena y encontrar reemplazar.
  2. Puede crear un objeto DOM, convertir el conjunto de bytes en cadena, cargarlo y agregar el valor a los atributos donde sea necesario (básicamente, está buscando cualquier atributo src, href que no tenga http: o https: en eso).
 
    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.") 

Esto es súper artificial y de hecho la peor parte principal de la misma es tomada directamente de: http://msdn.microsoft.com/en-us/library/xz398a3f.aspx pero ilustra el principio básico detrás método 1.

+0

Gracias, sé el camino de esta manera, pero espero que haya alguna manera más fácil de hacerlo =) –

2

si la petición viene de su sitio (igual enlaces de dominio), puede utilizar esto:

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

Si estás en una aplicación no web, o si desea codificar el nombre de dominio:

new Uri("http://www.mysite.com", "/img/welcome.png").ToString(); 
+0

Necesito reemplazar todos los elementos 'src y href en el html, no solo obtengo una ruta. –

0

sólo tiene que utilizar esta función

'# 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

en lugar de resolver/completar las rutas relativas, se puede tratar de establecer el elemento base con la href-attrib = el baseURI original en cuestión.

Colocado como el primer elemento secundario del elemento del encabezado, todas las siguientes rutas relativas deben resolverse por el navegador para que apunte al destino original, no al lugar desde donde se encuentra el documento (boletín informativo).

en Firefox, algunos tautologic (< -en la lógica formal) al vaivén de conseguir/configuración de todos/href-attribs src CV de tener rutas completas escritas a todas las capas (en serie) de la html-doc, por lo tanto scriptable, salvable ...:

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

Por supuesto, la url() - bases func tal como figura en el estilo-Elemento (s, - para el fondo-img o de contenido-reglas), así como en estilo-attrib de en el nodo de nivel y en particular, los valores src/href declarados url() - func NO son considerados/probados por ninguna de las soluciones anteriores.

Por lo tanto, para obtener el enfoque de base elem a un estado válido, probado (compat-list), parece la noción más prometedora para mí.

Cuestiones relacionadas