python爬虫笔记(7)

xml
通过标签表达信息,成对出现,可扩展性好,但繁琐。
json
有类型的键值对,可以嵌套使用 ,适合程序处理(js),较xml简洁。
“key”:“value”
“key”:[“value1”, “value2”]
“key”:{“subkey”:“subvalue”}
yaml
无类型键值对,也就是没有引号,文本信息比例最好,可读性好。
name:
-北京理工大学
-天津大学
#表示注释,-表示并列的值信息,键值对之间可以嵌套。

信息提取的一般方法
方法一:完整解析信息的标记形式,再提取关键信息。
优点:信息解析准确。
缺点:提取过程繁琐,速度慢。
方法二 :无视标记形式,直接搜索关键信息。
对信息的文本查找函数即可。
优点:提取过程简洁,速度较快。
缺点:提取结果准确性与信息内容相关。
方法三:融合方法
提取HTML中所有URL链接
1搜索到所有<a>标签
2解析<a>标签格式,提取href后的链接内容。

<>.find_all(name, attrs, recursive,string, **kwargs)
返回 一个列表类型,存储查找的结果。
name:对标签名称的检索字符串。
attrs:对标签属性值的检索字符串 ,可标注属性检索。
recursive:是否对子孙全部检索,默认True。

打印所有标签

for tag in soup.find_all(True): print(tag.name)

找到所有的带有b的标签
for tag in soup.find_all(re.compile('b')): print(tag.name)

找带链接的
print(soup.find_all(id=re.compile(‘link’)))

找带关键字的
print(soup.find_all(string="Basic Python"))

用正则表达式找到带关键字的
print(soup.find_all(string=re.compile("python")))

<tag>(..) 等价于 <tag>.find_all(..)
soup(..) 等价于 soup.find_all(..)

扩展方法
<>.find():搜索 且只返回一个结果,字符串类型,通.find_all()参数。
<>.find_parents():在先辈结点中搜索,返回列表类型,同.find_all()参数。
<>.find_parent():在先辈结点中返回一个结果,字符串类型,同.find()参数。
<>.find_next_siblings():在后续平行节点中搜索 ,返回列表类型 ,同.find_all()参数。
<>.find_next_sibling():在后续平行节点中搜索,字符串类型,同.find()参数。
<>.find_previous_siblings():在前序平行节点中搜索,返回 列表类型,同.find_all()参数。
<>find_previous_sibling():在前序平行节点中返回一个结果,字符串类型,同.find()参数。

信息提取的一般方法
<>.find_all(name, attrs, recursive, string, **kwargs)
<tag>(..) 等价于 <tag>.find_all(..)
soup(..) 等价于 soup.find_all(..)

程序的结构设计
步骤一:从网络上获取大学排名网页内容
getHTMLText()
步骤 二:提取网页内容中信息到 合适的数据结构
fillUnivList()
步骤三:利用数据结构展示并输出结果
printUnivList()

爬取中国排名前20的网站

import requests
import bs4
from bs4 import BeautifulSoup

def getHTMLText(url):
    try:
        #获得网页
        r = requests.get(url, timeout = 30)
        #看异常信息
        r.raise_for_status()
        #修改编码
        r.encoding = r.apparent_encoding
        return r.text
    except:
        #有异常就返回空字符串
        return ""

def fillUnivList(ulist, html):
    #煮一锅汤
    soup = BeautifulSoup(html, "html.parser")
    #遍历tbody的孩子
    for tr in soup.find('tbody').children:
        #如果这个tag存在
        if isinstance(tr, bs4.element.Tag):
            #获得td标签列表
            tds = tr('td')
            #把想要的属性存到ulist中
            ulist.append([tds[0].string, tds[1].string, tds[2].string])



def printUnivList(ulist, num):
    #输出
    print("{:^10}\t{:^10}\t{:^10}".format("排名", "学校名称", "总分"))
    #循环
    for i in range(num):
        u = ulist[i]
        print("{:^10}\t{:^10}\t{:^10}".format(u[0], u[1], u[2]))
    print("Suc" + str(num))

def main():
    #数组,用来存结果
    uinfo = []
    url = 'http://www.zuihaodaxue.cn/zuihaodaxuepaiming2018.html'
    html = getHTMLText(url)
    fillUnivList(uinfo, html)
    printUnivList(uinfo, 20)

main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值