用于查找<a>链接的“href”值的正则expression式
我需要一个正则expression式模式来查找HTML中的网页链接。
我首先使用@"(<a.*?>.*?</a>)"
来提取链接( <a>
),但我无法从中获取href
。
我的string是:
-
<a href="www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
-
<a href="http://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
-
<a href="https://www.example.com/page.php?id=xxxx&name=yyyy" ....></a>
-
<a href="www.example.com/page.php/404" ....></a>
1,2和3是有效的,我需要它们,但是4号对我来说是无效的( ?
和=
是必需的)
谢谢大家,但我不需要parsing<a>
。 我有一个href="abcdef"
格式的链接列表。
我需要获取链接的href
并过滤它,我最喜欢的url必须包含?
和=
像page.php?id=5
谢谢!
我build议使用一个正则expression式的HTMLparsing器,但这里仍然是一个正则expression式,它将在每个链接的href
属性的值上创build一个捕获组。 它将匹配是否使用双引号或单引号。
<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1
你可以在这里查看这个正则expression式的完整解释。
片段游乐场:
let rx = /<a\s+(?:[^>]*?\s+)?href=(["'])(.*?)\1/, textToMatchInput = document.querySelector('[name=textToMatch]'); document.querySelector('button').addEventListener('click', function () { console.log(textToMatchInput.value.match(rx)); });
<label> Text to match: <input type="text" name="textToMatch" value='<a href="google.com"'> <button>Match</button> </label>
不推荐使用regex
来parsinghtml
regex
用于定期发生的模式。 html
不是正规的格式( xhtml
除外)。例如,即使你没有 closing tag
html
文件也是有效的!这可能会破坏你的代码。
使用像htmlagilitypack这样的htmlparsing器
您可以使用此代码使用HtmlAgilityPack
检索锚标记中的所有href's
HtmlDocument doc = new HtmlDocument(); doc.Load(yourStream); var hrefList = doc.DocumentNode.SelectNodes("//a") .Select(p => p.GetAttributeValue("href", "not found")) .ToList();
hrefList
包含所有的href
尝试这个 :
public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { var res = Find(html); } public static List<LinkItem> Find(string file) { List<LinkItem> list = new List<LinkItem>(); // 1. // Find all matches in file. MatchCollection m1 = Regex.Matches(file, @"(<a.*?>.*?</a>)", 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; } } }
input:
string html = "<a href=\"www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a> 2.<a href=\"http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a> ";
结果:
[0] = {www.aaa.xx/xx.zz?id=xxxx&name=xxxx} [1] = {http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx}
C#刮取HTML链接
刮HTML提取重要的页面元素。 它有许多网站pipe理员和ASP.NET开发人员的合法用途。 使用Regextypes和WebClient,我们实现HTML的屏幕抓取。
编辑
另一个简单的方法是:你可以使用web browser
控件从标签a
获取href
,如下所示:(参见我的示例)
public Form1() { InitializeComponent(); webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); } private void Form1_Load(object sender, EventArgs e) { webBrowser1.DocumentText = "<a href=\"www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a><a href=\"http://www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a><a href=\"https://www.aaa.xx/xx.zz?id=xxxx&name=xxxx\" ....></a><a href=\"www.aaa.xx/xx.zz/xxx\" ....></a>"; } void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { List<string> href = new List<string>(); foreach (HtmlElement el in webBrowser1.Document.GetElementsByTagName("a")) { href.Add(el.GetAttribute("href")); } }
试试这个正则expression式:
"href\\s*=\\s*(?:\"(?<1>[^\"]*)\"|(?<1>\\S+))"
您将从以下讨论中获得更多帮助:
正则expression式从HTML链接提取URL
和
正则expression式在href中获取链接。 [asp.net]
希望它的帮助。
HTMLDocument DOC = this.MySuperBrowser.Document as HTMLDocument; public IHTMLAnchorElement imageElementHref; imageElementHref = DOC.getElementById("idfirsticonhref") as IHTMLAnchorElement;
只需尝试此代码
我想出了这个,支持锚点和图像标签,并支持单引号和双引号。
<[a|img]+\\s+(?:[^>]*?\\s+)?[src|href]+=[\"']([^\"']*)['\"]
所以
<a href="/something.ext">click here</a>
匹配:
Match 1: /something.ext
和
<a href='/something.ext'>click here</a>
匹配:
Match 1: /something.ext
img src属性也一样
谢谢大家(特别是@plalx)
我觉得这是相当矫枉过正的强化href属性的有效性这样一个复杂和神秘的模式,而一个简单的expression式,如
<a\s+(?:[^>]*?\s+)?href="([^"]*)"
足以捕获所有的URL。 如果你想确保它们至less包含一个查询string,你可以使用
<a\s+(?:[^>]*?\s+)?href="([^"]+\?[^"]+)"
我最后的正则expression式string:
首先使用下面的一个:
st =@"((www\.|https?|ftp|gopher|telnet|file|notes|ms-help):((//)|(\\\\))+ \w\d:#@%/;$()~_?\+-=\\\.&]*)"; st = "@<a href[^>]*>(.*?)</a>"; 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=[""'](?<url>(http|https)://[^/]*?\.(com|org|net|gov))(/.*)?[""']"; st = @"(<a.*?>.*?</a>)"; 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 = @"(?<Protocol>\w+):\/\/(?<Domain>[\w.]+\/?)\S*";
我的select是
@"(?<Protocol>\w+):\/\/(?<Domain>[\w.]+\/?)\S*"
第二使用这个:
st = "(.*)?(.*)=(.*)";