“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())) #排序比较时忽略大小写