我正在尝试使用 grep 和 cut 从 HTML 文件中提取 URL。链接看起来像:
<a href="http://examplewebsite.com/">
其他网站有.net
,,.gov
但我想我可以在之前就设定截止点>
。所以我知道我可以使用 grep 和 cut 以某种方式切断 http 之前和 .com 之后的所有内容,但我已经坚持了一段时间了。
答案1
不确定您的工具是否受到限制:
但正则表达式可能不是如上所述的最佳方法,但这是我整理的一个示例:
cat urls.html | grep -Eo "(http|https)://[a-zA-Z0-9./?=_%:-]*" | sort -u
grep -E
: 与egrep相同grep -o
:仅输出已 grep 的内容(http|https)
: 是一个 / 或a-z
: 全部小写A-Z
: 全部大写.
: 是点/
: 是斜杠?
: 是 ?=
: 是等号_
: 是下划线%
: 是百分号:
: 是冒号-
: 是破折号*
:重复[...]组sort -u
:将排序并删除所有重复项
输出:
bob@bob-NE722:~s$ wget -qO- https://stackoverflow.com/ | grep -Eo "(http|https)://[a-zA-Z0-9./?=_-]*" | sort -u
https://stackauth.com
https://meta.stackoverflow.com
https://cdn.sstatic.net/Img/svg-icons
https://stackoverflow.com
https://www.stackoverflowbusiness.com/talent
https://www.stackoverflowbusiness.com/advertising
https://stackoverflow.com/users/login?ssrc=head
https://stackoverflow.com/users/signup?ssrc=head
https://stackoverflow.com
https://stackoverflow.com/help
https://chat.stackoverflow.com
https://meta.stackoverflow.com
...
您还可以添加\d
以捕获其他数字类型。
答案2
正如我在评论中所说,使用正则表达式解析 HTML 通常不是一个好主意,但如果您正在解析的 HTML 表现良好,有时您可以摆脱它。
为了只获取元素href
属性中的 URL <a>
,我发现最简单的方法是分多个阶段进行。从您的评论来看,您似乎只想要顶级域名,而不是完整的 URL。在这种情况下,你可以使用这样的东西:
grep -Eoi '<a [^>]+>' source.html |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
其中source.html
包含要解析的 HTML 代码的文件。
此代码将打印作为每行中href
任何元素的属性出现的所有顶级 URL 。第一个命令的选项<a>
是确保它适用于和元素。我想你也可以给第二个来捕获大写属性,OTOH,我宁愿忽略这种损坏的 HTML。 :)-i
grep
<a>
<A>
-i
grep
HREF
处理内容http://google.com/
wget -qO- http://google.com/ |
grep -Eoi '<a [^>]+>' |
grep -Eo 'href="[^\"]+"' |
grep -Eo '(http|https)://[^/"]+'
输出
http://www.google.com.au
http://maps.google.com.au
https://play.google.com
http://www.youtube.com
http://news.google.com.au
https://mail.google.com
https://drive.google.com
http://www.google.com.au
http://www.google.com.au
https://accounts.google.com
http://www.google.com.au
https://www.google.com
https://plus.google.com
http://www.google.com.au
当我被重定向到澳大利亚 Google 页面时,我的输出与其他示例略有不同。
答案3
如果您的 grep 支持 Perl 正则表达式:
grep -Po '(?<=href=")[^"]*(?=")'
(?<=href=")
并且(?=")
是环视四周属性的表达式href
。这个需要-P
选择。-o
打印匹配的文本。
例如:
$ curl -sL https://www.google.com | grep -Po '(?<=href=")[^"]*(?=")'
/search?
https://www.google.co.in/imghp?hl=en&tab=wi
https://maps.google.co.in/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
https://www.youtube.com/?gl=IN&tab=w1
https://news.google.co.in/nwshp?hl=en&tab=wn
...
与往常一样,无法保证这些是有效的 URI,或者您正在解析的 HTML 是有效的。
答案4
我在这里找到了解决方案恕我直言,这比这里提出的要简单得多,而且可能更快。我做了一些调整以支持 https 文件。但 TD;TR 版本是...
PS:您可以将站点 URL 替换为文件路径,效果相同。
lynx -dump -listonly -nonumbers "http://www.goggle.com" > links.txt
lynx -dump -listonly -nonumbers "some-file.html" > links.txt
如果您只想查看链接而不是将它们放入文件中,请尝试此操作......
lynx -dump -listonly -nonumbers "http://www.google.com"
lynx -dump -listonly -nonumbers "some-file.html"
结果将类似于以下内容......
http://www.google.ca/imghp?hl=en&tab=wi
http://maps.google.ca/maps?hl=en&tab=wl
https://play.google.com/?hl=en&tab=w8
http://www.youtube.com/?gl=CA&tab=w1
http://news.google.ca/nwshp?hl=en&tab=wn
https://mail.google.com/mail/?tab=wm
https://drive.google.com/?tab=wo
https://www.google.ca/intl/en/options/
http://www.google.ca/history/optout?hl=en
...
etc.
对于我的用例来说,这工作得很好。但请注意,如今,人们为库的 CDN URI 添加诸如 src="//blah.tld" 之类的链接。我不想在检索到的链接中看到那些内容。
无需尝试检查 href 或其他链接源,因为“lynx -dump”默认会从给定页面提取所有可点击的链接。因此,您之后唯一需要做的就是使用 grep 解析“lynx -dump”的结果,以获得相同结果的更清晰的原始版本。