【问题标题】:Extracting hyperlinks from a page using wget and grep使用 wget 和 grep 从页面中提取超链接
【发布时间】:2019-05-19 17:21:34
【问题描述】:

我正在尝试使用 wget 和 grep 提取单个页面中的所有超链接,我发现这段代码使用 PCRE 来获取所有超链接。

但我对 regex 或 html 并不是很熟悉,所以我真的很想知道这是否是一种可行的方法,或者是否有更好的方法。 我也有一个问题。你真的需要转义引号吗?我测试了几次,但似乎没有什么不同。

wget https://google.com -q -O - | grep -Po '(?<=href=\")[^\"]*'

任何帮助将不胜感激!

【问题讨论】:

  • 嗯,它似乎确实有效。有什么问题?
  • @Jack 我只是模糊地担心这是否适用于所有用例。由于我真的不太了解 HTML,我只是希望有人能确认这是否正确完成
  • 不,它不会在所有情况下都有效,并且没有正确完成。谷歌 xmlstarlet 和 xmllint 来查看一些可靠解析 XML 的工具(或用它们标记这个问题)

标签: regex bash grep wget pcre


【解决方案1】:

您的命令将获取完全存在于一行中的所有 href 字符串 href="..." 的内容。

如果整个字符串被'single quotes' 包围,您不需要单独转义双引号\"。引用的目的是防止字符被 shell 解释。唯一需要转义双引号的时候是允许扩展时,例如:

foo=href
grep -Po "(?<=${foo}=\")[^\"]*"

这完全一样

grep -Po '(?<=href=")[^"]*'

这意味着

  • Grep,使用 PCRE
  • 返回only 匹配
  • 查找前面有(?&lt;=...)的任何字符串href="
  • 匹配任何不是双引号[^"]
  • 零次或多次*

如果您曾经解析过&lt;a href=""&gt;,使用* 可能会返回一个空字符串。您可以使用+(一次或多次)代替*(零次或多次)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 2014-03-19
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多