Necesito un patrón de expresiones regulares para encontrar enlaces a páginas web en HTML.
Primero uso @"(.*?)"
para extraer enlaces ( ), pero no puedo obtener
href
de eso.
Mis hilos son:
1, 2 y 3 son válidos y los necesito, pero el número 4 no es válido para mí ( ?
Y =
es esencial)
Gracias a todos, pero no necesito analizar . Tengo una lista de enlaces en formato
href="abcdef"
.
Necesito buscar href
de los enlaces y filtrarlo, mis URLs favoritas deben contenerse ?
y =
como page.php?id=5
¡Gracias!
Recomiendo usar un analizador HTML sobre una expresión regular, pero aún así hay una expresión regular que creará un grupo de captura sobre el valor del atributo href
de cada enlace. Coincidirá si se utilizan comillas dobles o simples.
]*?\s+)?href=(["'])(.*?)\1
Puede ver una explicación completa de esta expresión regular aquí .
Patio de Snippet:
No se recomienda usar regex
para analizar html
regex
se usa para patrones que ocurren regularmente. html
no es regular con su formato (excepto xhtml
) .Por ejemplo, los archivos html
son válidos incluso si no tiene una closing tag
. Esto podría romper su código.
Usa un analizador html como htmlagilitypack
Puede usar este código para recuperar todos los href's
en la etiqueta de anclaje usando HtmlAgilityPack
HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var hrefList = doc.DocumentNode.SelectNodes("//a") .Select(p => p.GetAttributeValue("href", "not found")) .ToList();
hrefList
contiene todos los href`s
Prueba esto :
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var res = Find(html); } public static List Find(string file) { List list = new List (); // 1. // Find all matches in file. MatchCollection m1 = Regex.Matches(file, @"(.*?)", RegexOptions.Singleline); // 2. // Loop over each match. foreach (Match m in m1) { string value = m.Groups[1].Value; LinkItem i = new LinkItem(); // 3. // Get href attribute. Match m2 = Regex.Match(value, @"href=\""(.*?)\""", RegexOptions.Singleline); if (m2.Success) { i.Href = m2.Groups[1].Value; } // 4. // Remove inner tags from text. string t = Regex.Replace(value, @"\s*<.*?>\s*", "", RegexOptions.Singleline); i.Text = t; list.Add(i); } return list; } public struct LinkItem { public string Href; public string Text; public override string ToString() { return Href + "\n\t" + Text; } } }
Entrada:
string html = " 2. ";
Resultado:
[0] = {www.aaa.xx/xx.zz?id=xxxx&name=xxxx} [1] = {http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx}
C # Scraping Enlaces HTML
El raspado de HTML extrae elementos importantes de la página. Tiene muchos usos legales para webmasters y desarrolladores de ASP.NET. Con el tipo Regex y WebClient, implementamos el raspado de la pantalla para HTML.
Otra manera fácil: puede usar un control de web browser
para obtener href
de la etiqueta a
, como esta: (ver mi ejemplo)
public Form1() { InitializeComponent(); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); } private void Form1_Load(object sender, EventArgs e) { webBrowser1.DocumentText = ""; } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { List href = new List (); foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("a")) { href.Add(el.GetAttribute("href")); } }
Prueba esta expresión regular:
"href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))"
Obtendrá más ayuda de las discusiones sobre:
Expresión regular para extraer URL de un enlace HTML
y
Regex para obtener el enlace en href. [asp.net]
Espero que sea útil.
HTMLDocument DOC = this.MySuperBrowser.Document as HTMLDocument; public IHTMLAnchorElement imageElementHref; imageElementHref = DOC.getElementById("idfirsticonhref") as IHTMLAnchorElement;
Simplemente prueba este código
Me resulta bastante exagerado aplicar la validez del atributo href con un patrón tan complejo y críptico, mientras que una expresión simple como
]*?\s+)?href="([^"]*)"
sería suficiente para capturar todas las URL. Si quiere asegurarse de que contienen al menos una cadena de consulta, puede usar
]*?\s+)?href="([^"]+\?[^"]+)"
Primero usa uno de esto:
st =@"((www\.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+ \w\d:#@%/;$()~_?\+-=\\\.&]*)"; st = "@]*>(.*?)"; st = @"((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)"; st = @"((?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\\\)(?:www\.)?|www\.)[\w\d:#@%/;$()~_?\+,\-=\\.&]+)"; st = @"(?:(?:https?|ftp|gopher|telnet|file|notes|ms-help):(?://|\\\\)(?:www\.)?|www\.)"; st = @"(((https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+)|(www\.)[\w\d:#@%/;$()~_?\+-=\\\.&]*)"; st = @"href=[""'](?(http|https)://[^/]*?\.(com|org|net|gov))(/.*)?[""']"; st = @"(.*?)"; st = @"(?:hrefs*=)(?:[s""']*)(?!#|mailto|location.|javascript|.*css|.*this.)(?.*?)(?:[s>""'])"; st = @"http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"http(s)?://([\w-]+\.)+[\w-]+(/[\w- ./?%&=]*)?"; st = @"(http|https)://([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"((http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?)"; st = @"http://([\\w+?\\.\\w+])+([a-zA-Z0-9\\~\\!\\@\\#\\$\\%\\^\\&\\*\\(\\)_\\-\\=\\+\\\\\\/\\?\\.\\:\\;\\'\\,]*)?"; st = @"http(s?)\:\/\/[0-9a-zA-Z]([-.\w]*[0-9a-zA-Z])*(:(0-9)*)*(\/?)([a-zA-Z0-9\-\.\?\,\'\/\\\+&%\$#_]*)?$"; st = @"(?\w+):\/\/(?[\w.]+\/?)\S*";
mi elección es
@"(?\w+):\/\/(?[\w.]+\/?)\S*"
Segundo Use esto:
st = "(.*)?(.*)=(.*)";
Se me ocurrió esta, que admite tags de anclaje e imagen, y admite comillas simples y dobles.
<[a|img]+\\s+(?:[^>]*?\\s+)?[src|href]+=[\"']([^\"']*)['\"]
Asi que
click here
Coincidirá:
Match 1: https://stackoverflow.com/something.ext
Y
click here
Coincidirá:
Match 1: https://stackoverflow.com/something.ext
Lo mismo ocurre con los atributos img src