之前做好抓過好幾次網頁數據,一般都用了以下方法。
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