HTMLParser和BeautifulSoup使用入門和總結


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更方便使用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM