如何使用 grep 并插入脚本从 HTML 文件中获取网站 URL

如何使用 grep 并插入脚本从 HTML 文件中获取网站 URL

我正在尝试使用 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。 :)-igrep<a><A>-igrepHREF

处理内容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”的结果,以获得相同结果的更清晰的原始版本。

相关内容