bs4中.string和.text之于html注释的作用

159 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

python 爬虫
先总结: python在爬取的时候:
有注释的js尽量用text,不要用string

网络上对爬虫的定义是这样: 网络爬虫是一个自动提取网页的程序,它为搜索引擎从万维网上下载网页,是搜索引擎的重要组成。  传统爬虫从一个或若干初始网页的URL开始,获得初始网页上的URL,在抓取网页的过程中,不断从当前页面上抽取新的URL放入队列,直到满足系统的一定停止条件。 主要的目的就是为了代替人工的操作,在我休息的时候能够不断地对当前我想要爬取的数据进行收集、记录。在数据的保存方面也比较有学问,需要有专门的数据库进行存储、安放。我会在后面讲解完全进行爬虫相关操作的一系列流程。

python爬虫目前我使用到的比较多的就是:
1.面向静态的网页进行爬取
2.面向js进行爬取
在这里,我主要讲的就是读取已经生成的静态网页的网站,之后对js的相关接口进行分析也会继续进行讲解。
本文主要就是讲解在python制作的爬虫中如何处理相关的网页数据,如何应对其中的注释

对于有注释的html文件: image.png

出现了一个好奇怪的现象:
就是再适用bs4的时候,对于之前书本上学到的.text和.string之间的关系,text用于一个大标签中有多个字符串的情况,会返回用空格隔开的一大串字符串;但是string则是再这个情况之下会失灵,对于多个字符串只能返回none

但是在此处,虽然只有一个字符串,但是在字符串中间出现了<!---->这种情况。

我们要格外的注意: 有注释就不能适用string进行爬取,否则会返回none!应该使用text! 同时,text的返回值由于注释的存在会有很多空格,我们用.strip()即可去除 md,今天为了这个试了好久,难受

仔细观察上面的图片:
a开头的就可以适用:string
其他的td就必须用text
//////////////////////////我是分割线/////////////////////////////////////////////// 发表一个爬虫的用法,书上没有教过: image.png 完整示范代码如下:

# coding=utf-8
import requests
from bs4 import BeautifulSoup
import bs4

ulist1=[]

def getHTMLText(url):#获取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):#将html页面放到ulist列表中(核心)
    soup = BeautifulSoup(html,"html.parser")
    for tr in soup.find('tbody').children:
        if isinstance(tr,bs4.element.Tag):#如果tr标签的类型不是bs4库中定义的tag类型,则过滤掉
            a = tr('a')
            tds = tr('td')#将所有的td标签存为一个列表类型
            # print(tds)
            ulist.append([tds[0].text.strip(), a[0].string.strip(), tds[4].text.strip()])#11.17更新后代码
            print(tds[0].string)
            # print(a[0].string)
            # print()
			#原来代码ulist.append([tds[0].string.strip(),a[0].string.strip(),tds[4].string.strip()])

def printUnivList(ulist1,num):#打印出ulist列表的信息,num表示希望将列表中的多少个元素打印出来
    #格式化输出
    tplt = "{0:^10}\t{1:{3}^12}\t{2:^10}"
    # 0、1、2为槽,{3}表示若宽度不够,使用format的3号位置处的chr(12288)(中文空格)进行填充
    print(tplt.format("排名","学校名称","总分",chr(12288)))
    for i in range(num):
        u = ulist1[i]
        print(tplt.format(u[0], u[1], u[2],chr(12288)))
    print()
    print("共有记录"+str(num)+"条")

def main():
    uinfo = [] #将大学信息放到列表中
    url = "https://www.shanghairanking.cn/rankings/bcur/2020"
    html = getHTMLText(url)
    fillUnivList(uinfo,html)
    printUnivList(uinfo,10)

main()

加油!