join函数的参数只能是字符串、列表、元组字典格式
使用HTMLParser
背景:抓取http://python.org/jobs的职业和链接
新建类,继承HTMLParser类,重载handle_starttag/handle_data/handle_endtag方法
handle_starttag遇到开始标签时候调用
handle_data遇到文本数据时调用
handle_endtag遇到结束标签时候调用
这段代码重要的地方是设置了in_link,用于跟踪每一段方法是否在相关的链接里
from urllib.request import urlopen
from html.parser import HTMLParser
def is_job(url):
try:
a,b,c,d=url.split('/')
except ValueError:
return False
return a==d=='' and b=='jobs' and c.isdigit() #c.isdigit() 函数说明:检查参数c是否为阿拉伯数字0到9
class Scraper(HTMLParser):
in_link=False
def handle_starttag(self, tag, attrs): #tag是html的标签,attrs是html标签的属性(href="/jobs/5363/"),
# 是一个列表,列表的内容是元组形式(属性名,值)
# print(tag,'---',attrs)
attrs=dict(attrs) #转换为字典
url=attrs.get('href','') #在字典中找key为href的,找不到的url置为空
if tag=='a' and is_job(url):
self.url=url
self.in_link=True
self.chunks=[]
def handle_data(self, data):
if self.in_link:
self.chunks.append(data) #获取标签内容,并添加到列表中。
# print(self.chunks) #这里打印chunks列表的内容不一定是对应链接的,因为没充值in_link的值
def handle_endtag(self, tag):
if tag=='a' and self.in_link:
print("{}:{}".format(''.join(self.chunks),self.url))
# print(self.chunks) #打印职业
self.in_link=False #这一步很重要,in_link跟踪自己是否位于相关的链接里
text=urlopen('http://python.org/jobs').read().decode()
parser=Scraper()
parser.feed(text)
parser.close()