改写书上过期的例子

“Beginning.Python.From.Novice.to.Professional,2nd.Edition” 里面的347-348 of 667 (pdf page),因为网页更新,原来的例子已经不能用啦。下面是我改的最新版的python2.7下的代码。
用HTMLParser这个烦是烦,但是里面的逻辑值得小小品味。
本质是个循环,然后把里面各种方法改写一下。好有意思。多谢Amber Dang同学教我如何查看,也特别感谢下面这篇博客,放了HTMLParser的源码。
http://blog.csdn.net/uestcyao/article/details/7876686

#使用HTMLParser的爬虫
from urllib import urlopen
from HTMLParser import HTMLParser

class Scraper(HTMLParser):

    in_h2 = False
    in_link = False

    def handle_starttag(self,tag,attrs):
        attrs = dict(attrs)
        if tag =='h2':
            self.in_h2 = True

        if tag =='a' and 'href' in attrs:
            self.in_link = True
            self.chunks = []
            self.url = attrs['href']


    def handle_data(self, data):
        if self.in_link:
            self.chunks.append(data)

    def handle_endtag(self,tag):  #这段比较微妙,有意思。
        if tag =='h2':
            self.in_h2 = False
        if tag == 'a':
            if self.in_h2 and self.in_link:
                print '%s (%s)' % (''.join(self.chunks),self.url)
            self.in_link = False

text = urlopen('http://python.org/jobs').read()
parser = Scraper() #创建Scraper对象,且此对象在创建时已经赋予HTMLParser对象的特征。
parser.feed(text) #其实就是HTMLParser.feed函数,跑到上面的Scraper定义的function里面去跑了。这种写法我自己是写不出的,缺少这种观念。
parser.close()
#使用beautiful soup
from urllib import urlopen
from BeautifulSoup import BeautifulSoup
from ipdb import set_trace

text = urlopen('http://python.org/jobs').read()
soup = BeautifulSoup(text)


jobs = set()



for header in soup('h2'):
    links = header('a')  #这里原来有个css class = reference,在现在的网页上,已经被干掉了。          
    if not links:continue
    link = links[0]
    jobs.add('%s (%s)' % (link.string,link['href']))

print '\n'.join(sorted(jobs,key=lambda s: s.lower())) #排序比较时忽略大小写
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取啥都被占用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值