пример использования streamhtmlparser - PullRequest
0 голосов
/ 11 августа 2009

Может ли кто-нибудь дать мне пример того, как использовать http://code.google.com/p/streamhtmlparser для анализа всех тегов A href из HTML-документа? (либо код 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 голос
/ 14 августа 2009
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 - он предназначен как шаблонизатор, в котором у вас есть маркеры в источнике, и вы обрабатываете ввод за символом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...