【问题标题】:Regular Expression to extract (video) names from html tags从 html 标签中提取(视频)名称的正则表达式
【发布时间】:2011-03-02 19:20:53
【问题描述】:

我有一个网页,其中包含以下代码 sn-p 包含视频链接:

<a href="video.php?video=sampel1.mov">
<a href="video.php?video=anothersample.mov">
<a href="video.php?video=yetanothersample.mov">

我想使用 sed 和正则表达式来提取视频名称,例如:

sampel1.mov 
anothersample.mov 
yetanothersample.mov

所以我可以使用wget 下载它们。

非常感谢!

【问题讨论】:

  • 也许你想要像 clive 这样的东西。
  • 事实证明grep 最适合这个问题!

标签: regex bash sed grep


【解决方案1】:

试试这个:

sed -n 's/.*video=\([^"]*\)">/\1/p' inputfile

使用 GNU grep:

grep -Po '(?<=video=).*?(?=">)' inputfile

通过xargs 传递这些命令中的任何一个:

command | xargs wget ...

【讨论】:

  • 如果我想得到 wget 立即使用的结果怎么办?我的意思是不要将结果放在文件中。
  • @DocWiki:我有选择地打印了sed 命令,并添加了一个以相同方式工作的grep 命令。两者都可以通过xargs 传递给wget。请查看我编辑的答案。
  • @Dennis Williamson 非常感谢。还有一个问题:即使以下三行合二为一,Kevin Ballard 的方法仍然有效: 但是你的 sed 方法行不通,我猜 sed 正在逐行工作。
  • @DocWiki:grep 命令将在这种情况下工作。这就是为什么 bta 的答案讨论了对此类文件使用适当的解析工具的原因。对此leads to madness 使用正则表达式。
  • @DocWiki:-P 选项启用 Perl 兼容正则表达式,-o 选项导致仅输出匹配的部分。 (?...) 模式是环视(向后看和向前看)。它们匹配其中的正则表达式,但不将其包含在结果中。见man pcrepattern
【解决方案2】:

你可以做一些简单的事情,比如

grep -o 'video.php?video=[^"]\+' | sed -e 's/^video.php?video=//'

【讨论】:

    【解决方案3】:

    您可以使用 sed 检索电影名称。

    创建一个文件,例如。 movie_string.txt 包含所有包含电影名称的字符串

    现在,创建一个 sed 脚本文件,例如 movie_name.sed,其中包含以下内容:

    s/\"//g
    s/&lt;//g
    s/&gt;//g
    s/\(.*=\)\([a-z]\)/ \2/

    保存并退出。

    现在从终端发出以下命令,将结果重定向到另一个文件movie.txt

    sed -f movie_name.sed movie_string.txt > movie.txt
    

    【讨论】:

      【解决方案4】:

      一个警告:使用正则表达式解析 HTML/XML 通常是not a good idea。相反,请使用 Ruby 或 Python 等具有 XML 解析器库的语言,该库可以智能地解释页面结构。

      这里有几个问题可能会对您有所帮助(更多问题只需快速搜索即可):

      更新:

      在您的评论中,您提到您已经知道如何在 Python 中进行链接提取,但您不想使用直接调用 wget 的 Python 脚本。您仍然可以使用 Python 解决这个问题(这可能是最简单的解决方案,因为您已经知道如何去做)。如果您的 Python 脚本将提取的文件名打印到标准输出并在每个名称后添加一个换行符,您可以使用以下任一 shell 命令来执行您想要执行的操作:

      python your_script.py >filenames.txt
      wget -i filenames.txt
      

      python your_script.py | wget -i -
      

      这会将您的脚本提取的数据传递给wget,而无需您的脚本通过系统调用调用wget

      【讨论】:

      • 在这种情况下大错特错:XML/HTML 几乎不可能用正则表达式解析,因为嵌套标签使其上下文无关。这就像处理平衡括号一样——当然,使用正则表达式会很困难。但是,在这种情况下,只检查打开的&lt;a&gt; 标记,因此正则表达式完全适合此任务。 (-1)
      • 我承认,如果&lt;a&gt; 标签不遵循常规模式(例如,如果在其中一些标签中的“href”之前有一个“title”属性,但在其他标签中没有),它变得更加困难。但事实仍然存在,只要您正在研究某种类型的严格开放标签,您就更有可能处理常规语言,并且下意识的“哦,没有人永远不会用正则表达式解析 HTML”的呐喊只会让你看起来很傻。
      • @Platinum Azure- 我主要是从这里糟糕的个人经历说的。我试图做类似的事情,只是被许多问题所困扰,例如 HTML cmets 中不需要的链接、跨越多行的 &lt;a&gt; 标签以及同一行中的多个 &lt;a&gt; 标签。考虑到使用智能 XML 解析器进行解析是多么容易,一开始就没有太多理由去纠结正则表达式。它可能适用于这个示例,但最好有适用于任何给定页面的东西。
      • 谢谢。我知道如何在 Python 中做到这一点。但我必须稍后使用 wget 。所以 Python 不是一个好的选择。
      • @DocWiki- 这如何使 Python 成为一个糟糕的选择?您可以从 Python 运行 wget 命令,您可以将文件列表写入 .txt 文件并将其作为输入提供给 wget(使用 wget -i filename.txt),或者您可以将文件列表发送到标准输出并将其输入wget -i -
      【解决方案5】:
      cat yourlinks.txt | cut -f2 -d\" | cut -f2 -d=
      

      【讨论】:

      • 我永远不会成为 emo 吸血鬼。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-11
      • 2018-07-20
      • 2018-05-08
      • 2017-05-08
      • 1970-01-01
      相关资源
      最近更新 更多