python 解析html中的link

本文介绍了Python中解析HTML的方法,包括使用htmllib.HTMLParser和BeautifulSoup。HTMLParser是一个不处理I/O的parser,它与formatter对象配合工作。通常会配合(formatter.DumbWriter)写入输出,可以通过cStringIO吸收输出。而BeautifulSoup虽然需要单独安装,但提供了更方便的HTML解析功能。

htmllib.HTMLParser

#!/usr/bin/env python
import cStringIO
import formatter
from htmllib import HTMLParser
import urllib

url = "http://blog.youkuaiyun.com/Lyq3413/article/details/76577465"
user_name = "proxy_account"
passwd = "proxy_pwd"
proxy_base = "proxy.example.net:8080"
proxy = "http://%s:%s@%s" % (user_name, passwd, proxy_base)
proxies = {"http": proxy, "https": proxy}
f = urllib.urlopen(url, proxies=proxies) #需要代理
#f = urllib.urlopen(url) #不需要代理可以直接这么写
data = f.read()
f.close()
parser = HTMLParser(formatter.AbstractFormatter(
    formatter.DumbWriter(cStringIO.StringIO())))
parser.feed(data)
parser.close()
print parser.anchorlist

这段代码的工作方式中,最重要的是parser 类不进行I/O,它只处理一个formatter 对象。
Python 只有一个formatter 对象,即formatter.AbstractFormatter,用来解析数据并使用writer
对象来分配其输出内容。同样,Python 只有一个有用的writer 对象,即formatter.DumbWriter。
可以为该对象提供一个可选的文件对象,表示将输出写入文件。如果不提供这个文件对象,
则会写入标准输出,但后者一般不是所期望的。为了不让输出写到标准输出,先实例化一个
cStringIO 对象。StringIO 对象会吸收掉这些输出

HTMLParser.HTMLParser

from HTMLParser import HTMLParser
from cStringIO import StringIO
from urllib2 import urlopen
import urllib2
from urlparse import urljoin


url = "http://blog.youkuaiyun.com/lyq3413/article/details/76577465"
user_name = "proxy_account"
passwd = "proxy_pwd"
proxy = "http://%s:%s@proxy.example.net:8080" % (user_name, passwd)
proxies = {"http": proxy, "https": proxy}
proxy_handler = urllib2.ProxyHandler(proxies)
opener = urllib2.build_opener(proxy_handler)
urllib2.install_opener(opener)
f = urlopen(url)
data = StringIO(f.read())
f.close()

class AnchorParser(HTMLParser):
    def handle_starttag(self, tag, attrs):
        if tag != 'a':
            return
        if not hasattr(self, 'data'):
            self.data = []
        for attr in attrs:
            if attr[0] == 'href':
                self.data.append(attr[1])

parser = AnchorParser()
parser.feed(data.read().decode('utf-8'))
for link in parser.data:
    print urljoin(url, link)

BeautifulSoup

BeautifulSoup不是标准库需要单独安装
pip 工具安装:
$pip install BeautifulSoup

from BeautifulSoup import BeautifulSoup, SoupStrainer

links = BeautifulSoup(data, parseOnlyThese=SoupStrainer('a'))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值