使用streamhtmlparser的示例

0 投票
1 回答
523 浏览
提问于 2025-04-15 13:31

有没有人能给我一个例子,教我怎么用http://code.google.com/p/streamhtmlparser来从一个HTML文档中提取所有的A标签的链接?(C++代码或者Python代码都可以,但我更希望看到用Python的例子)

我能在Python的测试中看到它是怎么工作的,但那些测试里已经在HTML中放了特定的标记,然后它会检查状态值。我不太明白在给解析器输入普通HTML时,怎么才能在状态变化时得到正确的回调。

我用下面的代码可以获取一些我想要的信息,但我需要一次性输入一块HTML,而不是一个字符一个字符地输入,而且我需要知道它什么时候完成了一个标签、属性等,而不仅仅是知道它是否在一个标签、属性或值里面。

import py_streamhtmlparser
parser = py_streamhtmlparser.HtmlParser()
html = """<html><body><a href='http://google.com'>link</a></body></html>"""
for index, character in enumerate(html):
   parser.Parse(character)
   print index, character, parser.Tag(), parser.Attribute(), parser.Value(), parser.ValueIndex()

你可以在这里看到这段代码的示例运行结果

1 个回答

1
import py_streamhtmlparser
parser = py_streamhtmlparser.HtmlParser()
html = """<html><body><a href='http://google.com' id=100>
        link</a><p><a href=heise.de/></body></html>"""
cur_attr = cur_value = None
for index, character in enumerate(html):
   parser.Parse(character)
   if parser.State() == py_streamhtmlparser.HTML_STATE_VALUE:
      # we are in an attribute value. Record what we got so far
      cur_tag = parser.Tag()
      cur_attr = parser.Attribute()
      cur_value = parser.Value()
      continue
   if cur_value:
      # we are not in the value anymore, but have seen one just before
      print "%r %r %r" % (cur_tag, cur_attr, cur_value)
      cur_value = None

给出

'a' 'href' 'http://google.com'
'a' 'id' '100'
'a' 'href' 'heise.de/'

如果你只想要链接的 href 属性,在打印的时候也要检查 cur_attr。

编辑: 目前 Python 的绑定不支持任何类型的事件回调。所以,唯一能得到的输出就是处理完输入后的状态。要改变这一点,可以在 htmlparser.c 的 exit_attr(等等)中增加一个回调函数。不过,这其实不是 streamhtmlparser 的目的——它是作为一个模板引擎使用的,目的是在源代码中有标记,然后逐个字符处理输入。

撰写回答