NashZhou

广告算法工程师,目前致力于关键词广告的效果自动优化

使用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

 

posted on 2013-04-28 14:51  NashZhou  阅读(3605)  评论(4编辑  收藏  举报

导航