我有一個不使用任何外部庫或包(例如Beautiful Soup等)的HTML解析器。它的工作原理在這裏它接受一個命令行html文件,並只返回文本。Python:僅使用我的HTML解析器返回hosts/a href
我想修改它,或者讓它有一個函數,即只返回主機名,比如HOST「HOST」>標籤;有它僅返回主機,只有頂層目錄的像「stackoverflow.com」等
class _DeHTMLParser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.__text = []
def handle_data(self, data):
text = data.strip()
if len(text) > 0:
text = sub('[ \t\r\n]+', ' ', text) #probably alter here?
self.__text.append(text + ' ')
def handle_starttag(self, tag, attrs):
if tag == 'p':
self.__text.append('\n\n')
elif tag == 'br':
self.__text.append('\n')
def handle_startendtag(self, tag, attrs):
if tag == 'br':
self.__text.append('\n\n')
def text(self):
return ''.join(self.__text).strip()
def dehtml(): #have it pass line?
try:
parser = _DeHTMLParser()
f = open(sys.argv[1], 'r') #not argv[1] but stdin all?
text = f.read()
f.close()
parser.feed(text)
parser.close()
return parser.text()
except:
print_exc(file=stderr)
return text
現在我可以調用dehtml(),它運行返回文本只/無標籤的版本。
爲了讓嘗試也打印出來的主機,我已將此添加變形點焊handle_starttag
if tag == 'a href':
self.__text.append()
,看它是否會作爲第一次嘗試,還追加了主機名,但沒有運氣。我相信這個問題是在我的handle_data部分,特別是在正則表達式位 - 這是正確的嗎?
什麼是你的實際問題呢? – 2014-10-16 15:14:51
@PaulCollingwood如果不清楚,我表示歉意。現在它返回標籤之外的文本,我希望它,而不是作爲一個附加功能,只返回* href標籤內的主機名*,例如返回HOST在 link – user3295674 2014-10-16 15:19:48
我應該做些什麼,內部handle_starttag,如果標籤==一個href然後打印? – user3295674 2014-10-16 15:21:46