【问题标题】:Looking for a way to trim HTML code using terminal commands寻找一种使用终端命令修剪 HTML 代码的方法
【发布时间】:2013-03-09 14:51:24
【问题描述】:

我正在尝试更好地学习awksed,以便能够在不需要PHP、Perl 等东西的情况下创建交叉兼容的终端工具。我现在正在尝试清理一个很长的字符串,它基本上是我使用curl 获取的 HTML 文档的一部分。我想知道解决这个问题的最佳方法。

我发现的大多数解决方案都依赖于静态文件或结构等奢侈品,但是当我试图清理获取的 HTML 代码时,我希望能够假设字符串的“外围”可以改变很多,无论是大小还是结构。所以我认为我需要做的基本上是识别 HTML 标签,因为这些标签可能不会改变,并从这些 HTML 标签中提取数据,无论它们在哪里。一个例子可能是这样的:

<span class="unique-class">Payload</span>

我需要能够查找整个 HTML 标记,当找到它时,我需要提取 > 之后的所有内容,直到找到 < 并开始另一个标记。

由于我的原始代码基本上是无用的,因为它只是 greps 行匹配某些单词(可能出现在同一页面上非有趣实例中的单词),我真的对任何事情持开放态度。

【问题讨论】:

  • 您不想为此使用sedawk。看 [x]html 解析,尝试用正则表达式来做是错误的做法,它可以send you crazy
  • 感谢@sudo_O 提供该链接,我现在知道为什么我在让它工作时遇到这样的问题 :)
  • 根据上面的评论,我现在已经开始(尝试)学习 Perl。谢谢:)

标签: html string parsing sed awk


【解决方案1】:

您很可能需要使用 Regex 来查找所需的字符串段,sedawk 将 Regex 作为一个选项,但可能需要切换才能这样做。我建议将标签作为整体查找,否则您最终可能会在结束标签和开始标签 (</span>stuff here<p>) 之间获得代码,这可能是您不想要的。

所以,你的正则表达式,最基本的,可能看起来像这样(未经测试,你可能需要调整它):

/\<[a-zA-z]\>/ /* Find the opening tag. */ 
/\<[/a-zA-z]\>/ /* Find the closing tag, note the presence of the "/" inside the square brackets.
*/

根据您的需要,您可以创建要查找的标签列表,具体而言,为您提供以下内容:

tags="div|p|article|section" /* Your list of tags, pipe-delimited for OR logic */
/\<$tags[:print:]\>/ /* The regex, looking for something like <div[anything]> */

您可以通过对开始标签进行正则表达式处理,将基本标签存储在变量中,然后找到匹配的结束标签,从而更进一步。这可能需要更多的工作才能正常工作,但它确实具有更强大的优势,并且自然地避免了在错误结束标签处停止的陷阱(即 - 当它应该停止在 @987654327 时停止在 &lt;/a&gt; @)。

一些注意事项 - 这可能会因为一些单字符标签而变得有点麻烦。如果你写得不够聪明,你的程序可能会混淆&lt;a&gt;&lt;article&gt; 之类的东西,所以请确保你的代码足够健壮以解决这个问题。

另外,不要忘记&lt;input&gt;s 用于生成大多数不同的表单输入,因此如果您关心它们是什么,请确保在遇到@ 时查找type 属性987654332@。

最后,你不能假设一个标签会有一个结束标签。有些标签没有标签(&lt;br/&gt;/&lt;br&gt;&lt;hr/&gt;/&lt;hr&gt;)并且 HTML 规范并不总是需要它们(&lt;li&gt;&lt;p&gt; 不需要结束标签因为下一个开始标签是另一个&lt;li&gt;&lt;p&gt;,或者后面是父级的结束标签)。你也不能假设你得到的 HTML 是有效的。因此,请务必考虑这些情况,以免您的应用程序崩溃和烧毁。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 2016-10-18
    • 2014-11-02
    • 1970-01-01
    相关资源
    最近更新 更多