之前做好抓过好几次网页数据,一般都用了以下方法。
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