Python静态网页解析库Bequtifulsoup4

本文介绍如何利用Python库BeautifulSoup4进行HTML文本解析。通过实例演示了find和select方法的应用,展示了如何从指定网站抓取数据并进行解析,提取所需信息。

Beautifulsoup4是用于解析html文本的Python库,官方指南参考
https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

find,
select方法:用CSS定位器查找html元素

# coding:utf-8

import requests
from bs4 import BeautifulSoup  #静态网页解析

#下述定义几个全局变量
BASE_LIB = 'html5lib'
BASE_URL = 'http://www.ip138.com'
UA = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.115 Safari/537.36'
HEADERS = {'user-agent':UA}

def handle_zip_code(province, url):
    print(province)
    resp = requests.get(url, headers=HEADERS)
    text = resp.text.encode('iso-8859-1').decode('gbk')
    bs = BeautifulSoup(text, BASE_LIB)
    rows = bs.select('table.t12 > tbody > tr') 
    #查找bs4解析后的html源码中表格的前13行tr(对照网页图看)
    print('_______________________________')
    #下述循环可以用数组切片替代,去掉表格第一行
    for i in range(1, len(rows)):
        items = rows[i].select('td') 
        #每一"行"的每个单元网格td取出,形成items 
        t_1 = items[0].text.strip() 
        #把表格每一行的第一个"元素"取出(市、县、区名),strip是去掉字符首尾空格
        if t_1:
            print('\t%s, %s' % (t_1, items[1].text.strip()))
        if len(items) > 4:
        #数据有两大列,有些网格右侧没有信息(比如滨海新区右侧没有别的区县)
            t_2 = items[3].text.strip()
            if t_2:
                print('\t%s, %s' % (t_2, items[4].text.strip()))

if __name__ == '__main__':
    resp = requests.get(BASE_URL + '/post', headers=HEADERS)
    text = resp.text.encode('iso-8859-1').decode('gbk')  
    #获得页面http://www.ip138/post.com文本内容
    bs = BeautifulSoup(text, BASE_LIB)
    #初始化一个bs4对象;默认使用lxml对html做解析,这里设置参数BASE_LIB是选择用'html5lib'对html做解析
    for item in bs.select('div#newAlexa > table.t4 > tbody > tr > td > a'):
        #bs4的select返回所有满足条件的元素,结构是数组,只有一个元素时也返回数组
        #select参数是html的查找层次,可以对照网页开发者工具里html代码查看对应关系
        print(item.text) #查找到的各个省市名字,a元素
        print(item.text, item.get('href'))
        #查找a元素的href属性,即URL尾巴上的各省市编号(参看网页html源码)
        print('_______________________________')
        handle_zip_code(item.text, BASE_URL + item.get('href'))
        #BASE_URL + item.get('href')是拼接每个省市完整的URL

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值