【问题标题】:extract text from between html tags with specific id using sed or grep使用 sed 或 grep 从具有特定 id 的 html 标记之间提取文本
【发布时间】:2012-10-20 04:36:34
【问题描述】:

我应该使用什么命令从位于“test.html”文件中的以下 html 代码中提取文本,该文件包含:“<span id="imAnID">extractme</span>”?

文件会更大,所以我需要将 grep 或 sed 指向一个 id,然后告诉它只从具有该 ID 的标签中提取文本。 假设我从文件所在的目录运行终端,我正在这样做:

cat test.html | sed -n 's/.*<span id="imAnID">\(.*\)<\/span>.*/\1/p'

我做错了什么?我得到一个空输出... 不反对为此使用 grep,如果它更容易的话。

【问题讨论】:

  • 它对我有用...不是源数据的问题吗?
  • 是的,但最终文件中还有其他 HTML 代码,此时上述命令产生 null...
  • 只是在飞鸟上射击,但也许您正试图在多行上使用正则表达式进行匹配?尝试添加 N;到您的 sed 模式... line 'N;s/.*

标签: html linux sed grep


【解决方案1】:

您可以尝试改用awk

  #!/bin/bash

  start_tag="span id=\"imAnID\""
  end_tag="/span"

  awk -F'[<>]' -v taga="$start_tag" -v tagb="$end_tag" '{ i=1; while (i<=NF) { if ($(i)==taga && $(i+2)==tagb) { print $(i+1) }; i++} }'

通过以下方式使用:

$ ./script < infile > outfile

【讨论】:

  • 找到了一个脚本不工作的好例子。你能测试一下,让我知道这是否有效,那将是极好的。我认为这可能是它的结构方式。我以亚马逊的 url 为例,脚本如下:#!/bin/bash wget -q -O ama.html "http://www.amazon.co.uk/Asus-GTX660-TI-DC2OG-2GD5-Borderlands-PCI-Express/dp/B008X36NHA/ref=sr_1_1?ie=UTF8&amp;qid=1351617700&amp;sr=8-1" start_tag="span id=\"priceLarge\"" end_tag="/span" awk -F'[&lt;&gt;]' -v taga="$start_tag" -v tagb="$end_tag" '{ i=1; while (i&lt;=NF) { if ($(i)==taga &amp;&amp; $(i+2)==tagb) { print $(i+1) }; i++} }' ama.html
  • 它应该只返回显卡的英镑价格。或者至少这是意图。
  • 问题也可能出在编码上——你使用的 wget 下载了 iso8859-1 中的亚马逊页面——在我的终端上,我使用 UTF8 语言环境,sed 期望输入为 UTF8...您需要对其进行重新编码,然后至少我的示例可以正常工作-只是价格不在范围内,而是在 ...
  • @Capt.Morgan,没有规则反对增强您的原始问题。为什么不使用涵盖预期案例、所需输出和迄今为止尝试过的代码的示例数据来重构您的问题。祝你好运。
【解决方案2】:

为此使用 awk、sed 或 grep 很尴尬,因为这些工具是基于行的(一次一行)。是否保证您尝试提取的跨度都在同一行?是否有可能在跨度内使用其他标签(例如em 标签)?如果不是,那么这听起来像是 perl 的工作。

【讨论】:

    【解决方案3】:

    awk、sed 和 grep 是面向行的工具。 XML 和 HTML 基于标签。两者结合得并不好,尽管在使用面向行的工具之前,您可以通过在 XML 或 HTML 上使用漂亮的格式化程序在 XML 和 HTML 上使用 awk、sed 和 grep。

    有一个名为 xmlgawk 的程序应该非常类似于 gawk,同时仍在处理 XML。

    我个人更喜欢在 Python 中使用 lxml 模块来做这种事情,这样可以完全理解 XML/HTML 而不会太罗嗦。

    【讨论】:

      【解决方案4】:

      使用grep -o

      echo "<span id="imAnID" hello>extractme</span> <span id='imAnID'>extractmetoo</span>" | grep -oE 'id=.?imAnID[^<>]*>[^<>]+' | cut -d'>' -f2
      

      会发现:

      #=>extractme
      #=>extractmetoo
      

      如果带有所需id 属性的span 元素紧接在extractme 内容之前,它将起作用。

      【讨论】:

      • 好的;以及如何使用 sed 来代替提取、替换?替换标签 id 中的任何文本。
      猜你喜欢
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 2013-09-09
      • 2014-12-16
      • 2012-10-25
      相关资源
      最近更新 更多