Python: htmllib.HTMLParser проблема с извлечением URL, когда <div>присутствует - PullRequest
0 голосов
/ 16 июня 2011

Я нашел странную вещь с htmllib.HTMLParser

вот код


import htmllib, formatter, sys

class LinksExtractor(htmllib.HTMLParser):

        def __init__(self, formatter) :
                htmllib.HTMLParser.__init__(self, formatter)
                self.links = []

        def start_a(self, attrs) :
                # process the attributes
                if len(attrs) > 0 :
                        for attr in attrs :
                                if attr[0] == "href" :
                                        self.links.append(attr[1])

        def get_links(self) :
                return self.links

format = formatter.NullFormatter()
htmlparser = LinksExtractor(format)

data = '''<div style="align:left; text-align:justify; width:500px; color:#000">Nice!<br/>
        <a href="http://example.com/">some anchor</a>
</div>'''

htmlparser.feed( data )
htmlparser.close()

links = htmlparser.get_links()

for url in links:
        print url

и ссылки не найдены :( При удалении тегов

все работает нормально. Кто знает, где ошибка - в коде или в моей ДНК?

Ответы [ 2 ]

0 голосов
/ 16 июня 2011

Я не уверен на 100%, почему, но библиотека в порядке с вашими тегами div - это тег

<br/> 

, который ему не нравится ... если вы замените

<br/> 

с

<br />

(т. Е. Добавить пробел после "br"), тогда он работает так, как вы ожидаете

... так что вы можете просто глобально заменить их все:

data = '''<div style="align:left; text-align:justify; width:500px; color:#000">Nice!<br/>
        <a href="http://example.com/">some anchor</a>
</div>'''.replace('<br/>','<br />')
0 голосов
/ 16 июня 2011

Проблема не в теге div, а в влиянии тега
. Парсер ищет начальный тег в формате и конечный тег в формате . А для таких тегов, как

abd
, нет ничего против конечного тега. Поэтому замените на
, и все будет в порядке.

Конечно, если вам нужно, чтобы этот пользовательский html работал, вам нужно переопределить другие HTMLParser, такие как start_tagname (), end_tagname () и do_tagname ()

Извините за пробелы, их проигрышный формат

...