2009-08-11 16 views
0

任何人都可以給我一個例子,如何使用http://code.google.com/p/streamhtmlparser來解析出HTML文檔中的所有A標記href的? (無論是C + +代碼或python代碼是好的,但我更喜歡一個使用python綁定的例子)使用streamhtmlparser的例子

我可以看到它是如何工作在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() 

你可以看到這個代碼的運行示例here

+0

難道你不能只爲每個區塊提供字符嗎? – user120242 2009-08-14 05:48:52

回答

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的用途 - 它是指模板引擎,在源代碼中有標記,並且您逐個字符地處理輸入字符。

+0

除了餵養單個人物還有什麼辦法嗎?餵養個別人物是非常好的表現明智 – Jehiah 2009-08-14 21:30:12

+0

我不明白這個問題:你想餵養個別人物,或不?爲什麼你認爲餵養個人角色有非常好的表現?我預計它的表現相對較差。 – 2009-08-14 22:12:25

+0

哎呀錯字。 '好'我的意思是'壞'。我寧願一次輸入一個完整的html文檔而不是一個字符,因爲我相信這樣會更高效。 – Jehiah 2009-08-15 03:00:12