11.bs4解析HTML

安装: pip install beautifulsoup4

查看是否安装成功:pip show beautifulsoup4  或者 pip list

soup = BeautifulSoup(markup, “html.parser”)  #python标准库, 获取的整个html对象

其他解析器:lxml, lxml-xml, xml, html5lib

print(soup.prettify())  #转换成有层级关系的格式

所有对象可归纳为4种:

Tag:标签对象

NavigableString:字符对象

BeautifulSoup: 整个html对象

Comment:注释对象

一、获取整个标签:

soup.标签名字

如获取title标签:soup.title, 获取结果带标签名字

注意:有多个标签名字的时候,只返回第一个,获取所有的需要用find_all()

二、获取多个同名标签:

用find_all()

all = soup.find_all(“a”) #获取所有的a标签   #可以填写属性find_all(class_=”content”)

print(all)

for i in all:

         print(i)

三、获取标签内的标签:

soup.标签名字(父).标签名字(子), 如:soup.p.b

四、获取标签中的字符串:

soup.标签名字.string如:soup.p.string

五、获取标签中的属性:

soup.a.attrs  (a标签中含有href=”xxx”的属性)

1.先通过a.attrs转换成字典,通过字典的键获取,从而获取属性的值

class属性不唯一,返回的是列表

2.直接通过属性获取,如:a[“href”],不需要转字典。

六、获取所有子孙节点的字符串:

标签.get_text()

返回的是list。

实例1:获取文本

思路:获取整个html;用属性去查找全部符合条件的list对象;用for循环打印出class标签下的span标签下的字符串print(i.span.get_text())

 1 #  coding:utf-8
 2 from bs4 import BeautifulSoup
 3 import requests
 4 
 5 url = 'https://www.qiushibaike.com/'
 6 r = requests.get(url)
 7 # print(r.content.decode("utf-8"))
 8 soup = BeautifulSoup(r.content, "html.parser")
 9 # print(soup.prettify())
10 all = soup.find_all(class_="recmd-content")  # 查找的是class_="recmd-content"的list对象,打印结果带有class标签
11 # print(all)
12 for i in all:
13     print(i.span.get_text().replace("\n", ""))  # get_text()获取标签下所有文本,获取当前节点下,子孙节点字符串,然后把空行去掉
实例:获取文本

实例2:下载图片

思路:获取整个html;用属性去查找全部符合条件的list对象;用for循环打印出class标签下img标签页的title和链接:print(i["title"]), print(i["data-original"]); 用try…except做处理,找到即打印出来,没有就pass;最后对图片进行存储处理

 1 #  coding:utf-8
 2 from bs4 import BeautifulSoup
 3 import requests
 4 import os
 5 
 6 url = 'http://699pic.com/sousuo-218808-13-1-0-0-0.html'
 7 r = requests.get(url)
 8 # print(r.content.decode("utf-8"))
 9 soup = BeautifulSoup(r.content, "html.parser") #获取整个html对象
10 # print(soup.prettify())
11 all = soup.find_all(class_="lazy")  # 查找的是class_="lazy"的list对象,打印结果带有class属性的img标签,里边有链接
12 # print(all)
13 cur_path = os.path.dirname(os.path.realpath(__file__)) #当前文件所在路径
14 pic_path = os.path.join(cur_path, "pic") #路径连接存放图片,需先新建pic文件夹
15 print(pic_path)
16 for i in all:
17     try:
18         pic_title = i["title"]  #img标签的对象 通过属性的key获取值
19         print(pic_title)
20         pic_url = i["data-original"]
21         print(pic_url)  # get_text()获取标签下所有文本,获取当前节点下,子孙节点字符串,然后把空行去掉
22         r2 = requests.get(pic_url) #请求图片的url地址,以得到二进制内容
23         with open(pic_path+"\\"+pic_title+".jpg", "wb") as f:  #存放图片的文件夹,连接图片title,以写入方法打开
24             f.write(r2.content)  #请求地址得到的二进制内容写进文件
25     except:
26         pass
实例:下载图片

猜你喜欢

转载自www.cnblogs.com/elaine888/p/11907203.html