使用SGMLParser抓取html里標簽內的數據


之前做好抓過好幾次網頁數據,一般都用了以下方法。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM