zoukankan      html  css  js  c++  java
  • 使用SGMLParser抓取html里标签<td>内的数据

    之前做好抓过好几次网页数据,一般都用了以下方法。

    1.最简单的find + split

    2.正则表达式,我仍然只会用点findall什么的。

    后来咨询过大牛。大牛回了个

    1         r = re.compile(r'(?s)<span class="(count|grade)">(?P<data>[^<]+)</span>')
    2         for m in r.finditer(content):
    3             v = m.group("data")
    4             print v.strip().replace(',', '')        

    用于抓取如下数据:

     1 <ul class="use-state">
     2                     <li>
     3                 <span class="label-like">有效评价:</span>
     4                 <span class="count">
     5                                             2,112 次
     6                                     </span>
     7             </li>
     8                 <li><span class="label-like">付费使用:</span><span class="count">1.5万人</span></li>
     9                 <li><span class="label-like">免费使用:</span><span class="count">132人</span></li>
    10                 <li><span class="label-like">浏览数:</span><span class="count">9.0万次/30天</span></li>
    11     </ul>

    大牛不愧是大牛,还说了可以了解了解 BeautifulSoup什么的

    3.后来碰到数据放到<td>data</td>里的

    1 <p>60  元/月</p>                        
    2                             </td>
    3                             <td> 2179 </td>
    4                             <td>18871</td>

    最后用SGMLParser 实现了

     1 from sgmllib import SGMLParser
     2 
     3 class MySgmlParser(SGMLParser):
     4 
     5     def __init__(self):
     6         SGMLParser.__init__(self)
     7         self.label = False
     8         self.num_list = []
     9 
    10     def start_td(self, attrs):
    11         self.label = True
    12 
    13     def end_td(self):
    14         self.label = False
    15 
    16     def handle_data(self, data):
    17         if self.label:
    18             data = data.strip()
    19             if data.isdigit():
    20                 self.num_list.append(int(data))

    这期间有两个小插曲

    一是第一次用SGMLParser的时候 失败了,就是抓到的data没有包含我要的数据,不知道为什么。隔了几周后,就行了。

    二是中间用过HTMLParser,但是抛异常。

    参考:http://hi.baidu.com/jfojfo/item/734283397d682e21b3c0c54d

  • 相关阅读:
    TOJ 5021: Exchange Puzzle
    Educational Codeforces Round 26
    2017 Multi-University Training Contest
    TOJ 5020: Palindromic Paths
    数论之 莫比乌斯函数
    TOJ 4475: The Coolest Sub-matrix
    Game on Tree
    python 线程
    python 管道、数据共享、进程池
    python 守护进程、同步锁、信号量、事件、进程通信Queue
  • 原文地址:https://www.cnblogs.com/2010Freeze/p/3049277.html
Copyright © 2011-2022 走看看