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

 

你可能感兴趣的:(parser)