Python:htmllib.HTMLParser在有<div>时提取url的问题
我发现了一个关于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
但是没有找到任何链接 :(
当我把<div>标签去掉后,一切都正常。谁知道这个问题是出在代码上,还是我自己身上呢?
2 个回答
0
我不太确定具体原因,但这个库对你的 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
问题不在于 div 标签,而是 < br/ > 标签。解析器会寻找格式为 < X > 的开始标签和格式为 < /X > 的结束标签。对于像 < p > 和 < br > 这样的标签,它们没有结束标签也没关系。所以你只需要把 < /br > 替换成 < br > 就可以了。
当然,如果你想让这个自定义的 HTML 正常工作,你需要重写其他的 HTMLParser,比如 start_tagname()、end_tagname() 和 do_tagname()。
抱歉关于空格的问题,格式有点乱。