我有一个HTML解析器,它不使用任何外部库或包(如Beautiful Soup等)。它可以工作,这里它使用一个命令行html文件,只返回文本。
我想修改它,或者让它有一个只返回主机名的函数,比如<a href"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('[ trn]+', ' ', text) #probably alter here?
self.__text.append(text + ' ')
def handle_starttag(self, tag, attrs):
if tag == 'p':
self.__text.append('nn')
elif tag == 'br':
self.__text.append('n')
def handle_startendtag(self, tag, attrs):
if tag == 'br':
self.__text.append('nn')
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(),它运行时返回纯文本/无标记版本。
为了让它也尝试打印主机,我将其添加到defhandle_starttag 中
if tag == 'a href':
self.__text.append()
作为第一次尝试,看看它是否会附加主机名,但运气不好。我相信问题出在我的handle_data部分,特别是regex位中——这是正确的吗?
handle_starttag
方法具有跟踪主机所需的所有信息。您需要解析url,因此将其添加到顶部
from urlparse import urlparse
然后在初始化时添加一个容器来容纳主机
def __init__(self):
HTMLParser.__init__(self)
self.__text = []
self.hosts = set()
然后,当您处于启动标记时,抓住主机。(编辑:错误地将attr用作dict)
def handle_starttag(self, tag, attrs):
if tag == 'p':
self.__text.append('nn')
elif tag == 'br':
self.__text.append('n')
elif tag == 'a':
for name, value in attrs:
if name == 'href':
self.hosts.add(urlparse(value).netloc.split(':')[0].lower())
break