1.HTMLParser一般这么用:
from html.parser import HTMLParser from urllib import request class MyHtmlParser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.categories = [] self.in_a = False def handle_starttag(self, tag, attrs): def _attr(attrs,attrname): for attr in attrs: if attr[0] == attrname: return attr[1] return None if tag == 'a' and _attr(attrs,'role') == 'menuitem': self.in_a = True def handle_endtag(self, tag): if tag == 'a' and self.in_a: self.in_a = False def handle_data(self, data): if self.in_a: self.categories.append(data)
2.BeautifulSoup一般这样:
soup = BeautifulSoup(price_html,'html.parser') soup.find_all('div',class_='abcd')
3.HTMLParser遇到div嵌套,handle_endtag里关闭div开关会提前关闭,试了很久目前没想出解决方案。
3.BeautifulSoup的find('div', class_='test')是find_all(...)的特殊情况,只匹配第一次。class是python预留关键字,所以加下划线区分,也可以这样attrs={'class':'test')。其中test还可以用正则表达式来匹配。
4.如果没有span, tag.div.a.span=None, tag.div.a.span.string会报错。
5.BeautifulSoup遇到问题:<a>kkk<span>lang</span></a>, a.string无法获得kkk, 就因为a里面嵌套了<span>
6.BeautifulSoup先读取整个html,生成对象树,比较耗内存,速度慢。但是比HTMLParser更方便使用。