寻找使用终端命令修剪HTML代码的方法

时间:2013-03-20 13:21:03

标签: html string parsing sed awk

我正在尝试更好地学习awksed,以便能够创建交叉兼容的终端工具而无需PHP,Perl等。我现在正在尝试清理一个非常长的字符串,它基本上是我用curl获取的HTML文档的一部分。我想知道最好的方法。

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

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

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

由于我的原始代码基本没用,因为它只是grep个匹配某些单词的行(可以在同一页面上的非有趣实例中显示的单词),我真的很开放任何东西。

1 个答案:

答案 0 :(得分:1)

您很可能需要使用正则表达式来查找所需的字符串段,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]> */

您可以通过Regexing进一步获取开始标记,将基础标记存储在变量中,然后找到匹配的结束标记。这可能需要更多的工作才能正常工作,但它确实具有更强大的优势,并且自然地避免了在错误的结束标记处停止的陷阱(即 - 当它应该停在</a>时停止</p>)。

一些注意事项 - 这可能会让一些单字符标签变得有点毛茸茸。如果您没有足够聪明地编写它,您的程序可能会混淆<a><article>之类的内容,因此请确保您的代码足够强大以便考虑到这一点。

另外,不要忘记<input>用于生成大多数不同的表单输入,因此如果您关心它们是什么,请确保每当您查找type属性时跨越<input>

最后,您不一定要认为标签会有结束标记。有些代码没有(<br/> / <br><hr/> / <hr>),HTML规范并不总是需要它们<li>和{只要下一个开始标记是另一个<p><li>,或者后面跟着父标记的结束标记,{1}}就不需要结束标记。您也不能假设您获得的HTML有效。因此,请务必考虑这些情况,以免您的应用程序崩溃和烧毁。