【问题标题】:Getting text from inside an HTML tag within a local file with grep [duplicate]使用 grep 从本地文件中的 HTML 标记中获取文本 [重复]
【发布时间】:2011-04-05 07:42:20
【问题描述】:

可能重复:
RegEx match open tags except XHTML self-contained tags

来自输入文件的摘录

<TD class="clsTDLabelWeb" width="28%">Municipality:&nbsp;</TD>
<TD style="WIDTH: 394px" class="clsTDLabelSm" colSpan="5">
<span id="DInfo1_Municipality">JUPITER</span></TD>

我的正则表达式

(?<=<span id="DInfo1_Municipality">)([^</span>]*)

我有一个保存到磁盘的 HTML 文件。 我想使用 grep 搜索文件并输出特定 span 的内容,虽然我不知道这是否是 grep 的正确使用。当我使用从另一个文件中读取的表达式对文件运行 grep 时(所以我不会弄乱任何特殊字符的转义),它不会输出任何内容。我已经在 RegExr 中测试了表达式,它与“JUPITER”匹配,这正是我想要返回的。非常感谢您的帮助!

期望的输出

JUPITER

【问题讨论】:

标签: html regex bash screen-scraping grep


【解决方案1】:

试试这个:

sed -n 's|^<span id="DInfo1_Municipality">\([^<]*\)</span></TD>$|\1|p' file

或使用 GNU grep 和您的正则表达式:

grep -Po '(?<=<span id="DInfo1_Municipality">)([^</span>]*)'

【讨论】:

  • 将 -P 标志传递给 grep 使我能够进行我所追求的后视/前瞻。感谢您的提示
【解决方案2】:
sed -n '/DInfo1_Municipality/s/<\/span.*//p' file | sed 's/.*>//'

【讨论】:

    【解决方案3】:

    Grep 不支持这种类型的正则表达式(lookbehind assertions),它是一个非常糟糕的工具,但对于给出的示例来说,它是可行的,在许多情况下都会崩溃。

    grep -io "<span id=\"DInfo1_Municipality\">.*</span>" file.htlm | grep -io ">[^<]*" | grep -io [^>]*
    

    像这样疯狂的东西,不是一个好主意。

    【讨论】:

    • 谢谢。我有一种感觉,我正在尝试做一些 grep 不支持的事情。看来我得做一些实际的编程了。
    猜你喜欢
    • 2011-08-07
    • 2012-01-06
    • 2010-12-08
    • 1970-01-01
    • 2012-06-12
    • 2012-04-03
    • 2017-12-13
    • 2013-04-03
    相关资源
    最近更新 更多