Loading...
墨滴

公众号:uncle39py

2021/12/28  阅读:31  主题:默认主题

BeautifulSoup

BeautifulSoup

BeautifulSoup主要用于提取想要的数据,可先看requests模块介绍:获取响应数据

1、安装模块

pip install beautifulsoup4

2、实例化

from bs4 import BeautifulSoup

soup=BeautifulSoup(res.text,'html.parser')

BeautifulSoup是一个类,实例化的第一个参数是需要解析的文本,通常为res.text,其中res是requests.get(url)发送请求后返回的响应对象。 第二个参数是解析器。BeautifulSoup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,常用的有lxml,需要安装pip install lxml,安装后即可使用soup=BeautifulSoup(res.text,'lxml')

3、主要的查找方式一:搜索文档树soup.find()

查找class为某某的div,查找id为某某的div

#class需要加_
div = soup.find(class_='article-wrapper')

#能用id尽量用id
div = soup.find(id='auto-channel-lazyload-article')

print(div)打印出来的是res.text中符合条件的div的内部全部标签(找到的是一片)。

div = soup.find(id='auto-channel-lazyload-article')返回的是一个BeautifulSoup对象,所以可以继续在此div对象下查找:ul=div.find(class_='article')

#继续找ul下的所有li
#可以通过标签名称查找,参数为name,直接找到所有的li标签,返回的是一个列表
li_list=ul.find_all(name='li')

补充:

  • find()找到一个,find_all()找到所有的,如果你点开find的源码会发现find里面就是调用find_all,取返回的列表的第一个值
  • 所有的属性都可以用来查找,比如soup.find(href='www.baidu.com')
  • 属性查找的另外一种方式soup.find(attrs={'href':www.baidu.com''})
  • limit参数:res=soup.find_all(name=True,limit=1)
  • recursive参数(recursive递归查找,等于True则找子子孙孙)soup.body.find_all(name='b ',recursive=False)
  • 可以支持列表、布尔值、正则来搜索(了解):res=soup.find_all(id=True)找有id属性的。res=soup.find_all(class_=['sister','title'])res=soup.find_all(name=re.compile('^b'))

4、主要的查找方式二:遍历文档树,直接通过soup.标签名字来取

res=soup.prettify() #处理好缩进,结构化显示
print(res)

遍历文档树:直接通过标签名字选择,特点是选择速度快,但如果存在多个相同的标签则只返回第一个。例子:

from bs4 import BeautifulSoup
html_doc = """
<html><head><title>The Dormouse's story</title></head>
<body>
<p id="my_p" class="title">hello<b id="bbb" class="boldest">The Dormouse's story</b>
</p>

<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>

<p class="story">...</p>
"""


head = soup.head
#打印出<head><title>The Dormouse's story</title></head>

head.name   # 获取标签名字head,不怎么用到

p = soup.body.p
print(p.attrs)  
#获取标签属性,打印出{'id': 'my_p', 'class': ['title']},其中class是一个列表
#重点常用,比如获取img标签src属性、a标签的href属性,可以找到下一个要请求的url


print(p.text)  # 会获取该标签下,及其子子孙孙的标签下的所有文本内容
p.string  #<p>123</p>,当且仅当这种情况下,能获取文本,否则返回None。少用
p.strings  #与p.text相似,不同之处:它返回的是一个生成器对象,这么设计的初衷是怕返回的内容太大,让你一个个的取

5、主要查找方式三:css选择器

ret=soup.select('写css选择器,记住两个:.class与#id')

ret=soup.select('#my_p')) 返回的ret是一个列表

再记住两个差别

ret=soup.select('body p')  # 子子孙孙
ret=soup.select('body>p')  # 直接子节点

以上三种查找方式返回的都是一个Tag对象,可以继续.往下查找

公众号:uncle39py

2021/12/28  阅读:31  主题:默认主题

作者介绍

公众号:uncle39py