zoukankan      html  css  js  c++  java
  • 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更方便使用。

  • 相关阅读:
    MySQL存储引擎与索引
    最长公共子序列
    最长递增子序列
    排序算法
    二分查找及其变种
    多线程中锁的种类。
    <LeetCode>136. 只出现一次的数字
    <LeetCode>121. 买卖股票的最佳时机
    Netty 粘包/拆包应用案例及解决方案分析
    微服务
  • 原文地址:https://www.cnblogs.com/jdbc2nju/p/9189208.html
Copyright © 2011-2022 走看看