【爬虫】3.学习beautifulsoup

1.beautifulsoup

BeautifulSoup是一个可以将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是python对象,所有对象可以归纳为4种:Tag、NavigableString、BeautifuSoup和Comment。

1.Tag 就是html中的一个个标签

tag有两个重要的属性,name和attrs

2.NavigableString 就是指内容

#打印出标签p中的内容
print (soup.p.string)

3.BeautifulSoup 表示的是一个文档的内容

⼤部分时候,可以把它当作Tag 对象, 是⼀个特殊的 Tag

4.Comment 特殊的NavigableString对象

1.1demo:

from bs4 import BeautifulSoup
import requests

url = 'https://movie.douban.com/top250?'
r = requests.get(url)
demo = r.text  # 服务器返回响应

soup = BeautifulSoup(demo, "html.parser")
"""
demo 表示被解析的html格式的内容
html.parser表示解析用的解析器
"""
print(soup)  # 输出响应的html对象
print(soup.prettify())  # 使用prettify()格式化显示输出

得到一个BeautifulSoup对象后,一般通过BeautifulSoup类的基本元素来提取html中的内容。

1.2提取html中的信息

 demo中的html内容如下:

(1)

print(soup.title)  # 获取html的title标签的信息
print(soup.a)  # 获取html的a标签的信息(soup.a默认获取第一个a标签,想获取全部就用for循环去遍历)
print(soup.a.name)   # 获取a标签的名字
print(soup.a.parent.name)   # a标签的父标签(上一级标签)的名字
print(soup.a.parent.parent.name)  # a标签的父标签的父标签的名字

(2)

print('a标签类型是:', type(soup.a))   # 查看a标签的类型
print('第一个a标签的属性是:', soup.a.attrs)  # 获取a标签的所有属性(注意到格式是字典)
print('a标签属性的类型是:', type(soup.a.attrs))  # 查看a标签属性的类型
print('a标签的class属性是:', soup.a.attrs['class'])   # 因为是字典,通过字典的方式获取a标签的class属性
print('a标签的href属性是:', soup.a.attrs['href'])   # 同样,通过字典的方式获取a标签的href属性

(3)

print('第一个a标签的内容是:', soup.a.string)  # a标签的非属性字符串信息,表示尖括号之间的那部分字符串
print('a标签的非属性字符串的类型是:', type(soup.a.string))  # 查看标签string字符串的类型
print('第一个p标签的内容是:', soup.p.string)  # p标签的字符串信息(注意p标签中还有个b标签,但是打印string时并未打印b标签,说明string类型是可跨越多个标签层次)

(4)findall方法

常用通过find_all()方法来查找标签元素:<>.find_all(name, attrs, recursive, string, **kwargs) ,返回一个列表类型,存储查找的结果 

• name:对标签名称的检索字符串
• attrs:对标签属性值的检索字符串,可标注属性检索
• recursive:是否对子孙全部检索,默认True
• string:<>…</>中字符串区域的检索字符串 

print('所有a标签的内容:', soup.find_all('a')) # 使用find_all()方法通过标签名称查找a标签,返回的是一个列表类型
print('a标签和b标签的内容:', soup.find_all(['a', 'b']))  # 把a标签和b标签作为一个列表传递,可以一次找到a标签和b标签

for t in soup.find_all('a'):  # for循环遍历所有a标签,并把返回列表中的内容赋给t
      print('t的值是:', t)  # link得到的是标签对象
      print('t的类型是:', type(t))
      print('a标签中的href属性是:', t.get('href'))  # 获取a标签中的url链接

 

2.丁香园论坛内容爬取

任务要求:

使用beautifulsoup提取下面丁香园论坛的特定帖子的所有回复内容,以及回复人的信息。

链接如下:http://3g.dxy.cn/bbs/topic/509959#!_id=626626

我们看到评论的内容在:

这个里面,我们用find_all看看:

content = soup.find_all("td", class_="postbody")
print(content)

用户名字在:

可以这样看:

content = soup.find("div", class_="auth").text
print(content)

find函数用法:

find(name, attrs, recursive, text, **wargs)    # recursive 递归的,循环的

这些参数相当于过滤器一样可以进行筛选处理。不同的参数过滤可以应用到以下情况:

查找标签,基于name参数

查找文本,基于text参数

基于正则表达式的查找

查找标签的属性,基于attrs参数

基于函数的查找

我把积分、title等信息也爬了出来,全部代码如下:

import urllib.request
from bs4 import BeautifulSoup 

url = 'http://www.dxy.cn/bbs/thread/626626#626626'
r = requests.get(url)
demo = r.text  # 服务器返回响应
soup = BeautifulSoup(demo, "html.parser")

datas = [] # 用来存放获取的用户名和评论
for data in soup.find_all("tbody"):
    try:
        userid = data.find("div", class_="auth").get_text(strip=True)
#         print(userid)
        content = data.find("td", class_="postbody").get_text(strip=True)
#         print(content)
        title=data.find("div",class_="user-level-area").text
        num=data.find("div",class_="num").text
        datas.append((userid,content,title,num))
    except:
        pass
for i in range(len(datas)):
    print(datas[i])


 

结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值