Python:只使用我的HTML解析器返回hosts / a href

时间:2014-10-16 15:06:48

标签: python html-parsing

我有一个HTML解析器,它不使用任何外部库或包(例如Beautiful Soup等)。它工作,在这里它需要一个命令行html文件,只返回文本。

我想修改它,或者让它具有仅返回主机名的功能,例如<中的HOST。 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('[ \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()并运行它返回纯文本/无标签版本。

为了尝试打印出主机,我将其添加到def handle_starttag

if tag == 'a href':
        self.__text.append()

看看它是否会作为第一次尝试附加主机名,但没有运气。我相信问题出在我的handle_data部分,特别是在正则表达式中 - 这是正确的吗?

1 个答案:

答案 0 :(得分:0)

handle_starttag方法包含跟踪主机所需的所有信息。您需要解析网址,然后将其添加到顶部

from urlparse import urlparse

然后在初始化时添加一个容器来容纳主机

def __init__(self):
    HTMLParser.__init__(self)
    self.__text = []
    self.hosts = set()

然后在启动标签时抓住主机。 (编辑:错误地将attr用作词典

def handle_starttag(self, tag, attrs):
    if tag == 'p':
        self.__text.append('\n\n')
    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