用于解析网页链接的正则表达式?

Posted

技术标签:

【中文标题】用于解析网页链接的正则表达式?【英文标题】:Regular expression for parsing links from a webpage? 【发布时间】:2010-09-05 14:11:30 【问题描述】:

我正在寻找一种 .NET 正则表达式,可以从网页中提取所有 URL,但还没有找到一个足够全面的方法来涵盖您可以指定链接的所有不同方式。

还有一个附带问题:

是否有一个正则表达式来统治所有这些?还是我最好使用一系列不太复杂的正则表达式,只对原始 html 使用多重传递? (速度与可维护性)

【问题讨论】:

强制引用***.com/questions/1732348/… 【参考方案1】:

查看 URI 规范。这可以帮助你很多。就性能而言,您几乎可以在一个普通网页中提取所有 HTTP 链接。当我说谦虚时,我绝对不是指像 ELisp 手册那样包含所有 HTML 手册的一页。性能也是一个敏感的话题。我的建议是衡量你的表现,然后决定是使用一个正则表达式还是使用多个更简单的正则表达式来提取所有链接。

http://gbiv.com/protocols/uri/rfc/rfc3986.html

【讨论】:

【参考方案2】:

网址?在图像/脚本/css/等中?

%href="(.["]*)"%

【讨论】:

【参考方案3】:

只要 HTML 的作者使用引号,这将捕获所有 a 标签中的 URL:

<a[^>]+href="([^"]+)"[^>]*>

我做了一个例子here。

【讨论】:

【参考方案4】:

我没有时间尝试考虑一个可能不起作用的正则表达式,但我想评论说你绝对应该打破你的正则表达式,至少如果它到达this level of ugliness:

(?:(?:\r\n)?[ \t])*(?:(?:(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t]
)+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ \t]))*"(?:(?:
\r\n)?[ \t])*)(?:\.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(
?:\r\n)?[ \t])+|\Z|(?=[\["()<>@,;:\\".\[\]]))|"(?:[^\"\r\\]|\\.|(?:(?:\r\n)?[ 
\t]))*"(?:(?:\r\n)?[ \t])*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\0
....*SNIP*....
*))*@(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])
+|\Z|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*)(?:\
.(?:(?:\r\n)?[ \t])*(?:[^()<>@,;:\\".\[\] \000-\031]+(?:(?:(?:\r\n)?[ \t])+|\Z
|(?=[\["()<>@,;:\\".\[\]]))|\[([^\[\]\r\\]|\\.)*\](?:(?:\r\n)?[ \t])*))*\>(?:(
?:\r\n)?[ \t])*))*)?;\s*)

(这应该与电子邮件地址匹配)

编辑:我什至无法将它放在一篇文章中,这太恶心了....

【讨论】:

【参考方案5】:
((mailto\:|(news|(ht|f)tp(s?))\://)1\S+)

我是从regexlib.com那里得到的

[编者注:1 在这个正则表达式中没有真正的功能; see this post]

【讨论】:

【参考方案6】:

所有 HTTP 和 MAILTO

(["'])(mailto:|http:).*?\1

由 href 或 src 调用的所有链接,包括相对链接。

#Matches things in single or double quotes, but not the quotes themselves
(?<=(["']))((?<=href=['"])|(?<=src=['"])).*?(?=\1)

#Maches thing in either double or single quotes, including the quotes.
(["'])((?<=href=")|(?<=src=")).*?\1

然而,第二个只会为您提供使用双引号的链接。

【讨论】:

【参考方案7】:

使用Html Agility Pack,您可以使用:

HtmlDocument doc = new HtmlDocument();
doc.Load("file.htm");
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a@href")

Response.Write(link["href"].Value);

doc.Save("file.htm");

【讨论】:

【参考方案8】:

来自 RegexBuddy 库:

网址:全文查找

最后的字符类确保如果 URL 是某些文本的一部分,则 URL 后的逗号或句号等标点不会被解释为 URL 的一部分。

\b(https?|ftp|file)://[-A-Z0-9+&amp;@#/%?=~_|!:,.;]*[-A-Z0-9+&amp;@#/%=~_|]

【讨论】:

【参考方案9】:

根据https://www.rfc-editor.org/rfc/rfc3986

从任何文本(不仅仅是 HTML)中提取 url

(http\\://[:/?#\\[\\]@!%$&'()*+,;=a-zA-Z0-9._\\-~]+)

【讨论】:

以上是关于用于解析网页链接的正则表达式?的主要内容,如果未能解决你的问题,请参考以下文章

用于解析 HTML 表格的正则表达式?

用于解析 CSV 的正则表达式

替代正则表达式以解析链接的 HTML 页面 [重复]

python爬虫--解析网页几种方法之正则表达式

用于解析重复组的正则表达式

从 html 代码中解析链接的正则表达式