C# Convertir par rapport à des Liens Absolus dans la Chaîne HTML
Je suis la mise en miroir de certains sites web internes à des fins de sauvegarde. En ce moment, j'utilise essentiellement ce code c#:
System.Net.WebClient client = new System.Net.WebClient();
byte[] dl = client.DownloadData(url);
Ce juste fondamentalement télécharge le html et dans un tableau d'octets. C'est ce que je veux. Le problème, toutefois, est que les liens dans le code html sont la plupart du temps relatif, pas absolu.
En gros, je veux ajouter quelque soit le plein http://domain.is avant le lien relatif à la convertir en un absolu lien qui vous redirigera vers le contenu original. Je suis fondamentalement juste une question href= src=. Est-il une expression regex qui couvrira une partie de la base de cas?
Modifier [Ma Tentative]:
public static string RelativeToAbsoluteURLS(string text, string absoluteUrl)
{
if (String.IsNullOrEmpty(text))
{
return text;
}
String value = Regex.Replace(
text,
"<(.*?)(src|href)=\"(?!http)(.*?)\"(.*?)>",
"<$1$2=\"" + absoluteUrl + "$3\"$4>",
RegexOptions.IgnoreCase | RegexOptions.Multiline);
return value.Replace(absoluteUrl + "/", absoluteUrl);
}
OriginalL'auteur Gary | 2010-10-01
Vous devez vous connecter pour publier un commentaire.
Le plus robuste solution serait d'utiliser la HTMLAgilityPack comme d'autres l'ont suggéré. Cependant une solution raisonnable en utilisant des expressions régulières est possible à l'aide de la Remplacer surcharge qui prend un MatchEvaluator délégué, comme suit:
L'exemple ci-dessus, les recherches pour attributs le nom de src et de href contenant le double des valeurs à la cote commençant par une barre oblique. Pour chaque match, la statique Uri.TryCreate méthode est utilisée pour déterminer si la valeur est valide par rapport uri.
Noter que cette solution n'est pas de poignée unique cité des valeurs d'attribut et certainement ne fonctionne pas sur le mal formé HTML avec des valeurs non cotées.
À l'aide d'un MatchEvaluator vous permet de grandement simplifier l'expression régulière pattern et l'utilisation beaucoup plus robuste Uri.TryCreate méthode à la place. Une expression régulière qui correspond à tous les possibles Uri serait extrêmement complexe.
Comment sur la performance sage? Et merci pour la réponse!
OriginalL'auteur Nathan Baulch
Vous devez utiliser HtmlAgility pack pour charger le code HTML, accéder à tous les hrefs de l'utiliser, et ensuite utiliser la classe Uri pour convertir du relatif à l'absolu nécessaire.
Voir, par exemple, http://blog.abodit.com/2010/03/a-simple-web-crawler-in-c-using-htmlagilitypack/
http://ww.baseurl.com/somedir
et j'essaie de créer un chemin absolut ajoutant/login.php
l'aide de votre méthode, j'obtienshttp://ww.baseurl.com/login.php
au lieu dehttp://ww.baseurl.com/somedir/login.php
OriginalL'auteur Ian Mercer
qui avec votre
Regex
approche fondée sur les est probablement (non testé) transposable à:Je doit aussi conseiller pas à utiliser
Regex
ici, mais à appliquer l'Uri astuce pour un peu de code à l'aide d'un DOM, peut-êtreXmlDocument
(si xhtml ou HTML Agility Pack (autrement), en regardant tous//@src
ou//@href
attributs.OriginalL'auteur Marc Gravell
Même si cela peut ne pas être le plus robuste de solutions, il devrait faire le travail.
OriginalL'auteur Matthew Manela
Vous pouvez utiliser le HTMLAgilityPack accomplir cette tâche. Vous voudriez faire quelque chose le long de ces (pas testé) lignes:
par rapport convertir absolu
uri
Voici quelques exemples:
Relatifs à des chemins absolus dans le HTML (asp.net)
http://htmlagilitypack.codeplex.com/wikipage?title=Examples&referringTitle=Home
http://blog.abodit.com/2010/03/a-simple-web-crawler-in-c-using-htmlagilitypack/
OriginalL'auteur Garett
Je pense que l'url est de type string. Utiliser l'Uri à la place avec une base uri pointant vers votre domaine:
OriginalL'auteur Yogesh
Il suffit d'utiliser cette fonction
OriginalL'auteur Smith
Fonction Simple
OriginalL'auteur Samidjo
Je sais que c'est une vieille question, mais j'ai trouvé comment faire avec un assez simple regex. Il fonctionne bien pour moi. Il gère http/https et relatifs à la racine du courant, le répertoire relatif.
OriginalL'auteur jfren484
c'est ce que vous cherchez, ce petit bout de code permet de convertir les Url relatives à l'absolu à l'intérieur de tout code HTML:
OriginalL'auteur Mahmoud