如何将HTML标记流重写为新文档?

时间:2010-02-21 20:39:34

标签: html parsing tokenize

假设我有一个已经标记化的HTML文档,我该如何将其转换为新文档或应用其他一些转换?

例如,假设我有这个HTML:

<html>
 <body>
  <p><a href="/foo">text</a></p>
  <p>Hello <span class="green">world</span></p>
 </body>
</html>

我目前所写的是一个输出标记流的标记器。对于本文档,他们将(用伪代码编写):

TAG_OPEN[html] TAG_OPEN[body] TAG_OPEN[p] TAG_OPEN[a] TAG_ATTRIBUTE[href]
TAG_ATTRIBUTE_VALUE[/foo] TEXT[text] TAG_CLOSE[a] TAG_CLOSE[p]
TAG_OPEN[p] TEXT[Hello] TAG_OPEN[span] TAG_ATTRIBUTE[class]
TAG_ATTRIBUTE_VALUE[green] TEXT[world] TAG_CLOSE[span] TAG_CLOSE[p]
TAG_CLOSE[body] TAG_CLOSE[html]

但现在我不知道如何使用此流来创建一些转换。

例如,我想将TAG_ATTRIBUTE_VALUE[/foo]中的TAG_OPEN[a] TAG_ATTRIBUTE[href]重写为其他内容。

我想要做的另一个转换是在括号中的TAG_ATTRIBUTE[href]之后输出TAG_OPEN[a]属性,例如,

<a href="/foo">text</a>

被重写为

<a href="/foo">text</a>(/foo)

进行此类转换的一般策略是什么?我还想做很多其他转换,比如剥离所有标签,只留下TEXT内容,在某些特定标签之后添加标签等。

我是否需要创建解析树?我从来没有这样做过,也不知道如何从令牌流中创建一个解析树。或者我能以其他方式做到吗?

欢迎任何建议。

还有一件事 - 我想自己学习所有这些解析,所以我不是在找图书馆!

预先感谢Boda Cydo

2 个答案:

答案 0 :(得分:0)

如果我们可以假设html符合xml,那么xslt将是一种方法。但我认为这样做会因为你似乎想要编写自己的解析器(不知道为什么)。 如果你真的想编写解析器(我编写解析规则,而不是你自己的解析器引擎),请看一下antlr和MS oslo。

答案 1 :(得分:0)

解析/遍历XML / HTML树有多种方法。也许我可以指出: -

http://razorsharpcode.blogspot.com/2009/10/combined-pre-order-and-post-order-non.html

如果您想对DOM元素进行预订或后序操作,可以使用那里描述的算法。