简单使用
在终端输入pip install bs4
安装模块
输入from bs4 import BeautifulSoup
引用BeautifulSoup
基本命令
以下内容出处>>>这里<<<
1.find
print(soup.find('a'))#找到的是第一个a标签
print(soup.find('a',title='a1'))#找到的是第一个a标签中带title属性且title属性为a1的
# print(soup.find('a',class='a2'))错误,无法查找是因为class在python中也是一个关键字
print(soup.find('a',class_='a2'))#找到的是第一个a标签中带class属性且class属性为a1的
2.find_all
print(soup.find_all('a'))#找到的是所有的a标签,存储为列表形式
print(soup.find_all(['a','span']))#找到的是所有的a和span标签,查找多个标签时,将其存在一个[]内
print(soup.find_all('li',limit=2))#找到的是前两个li标签,limit=多少就取多少项
3.select
print(soup.select('a'))#找到的是所有的a标签,存储为列表形式
print(soup.select('.a2'))#找到class内容为a2的标签,.代表class
print(soup.select('#a3'))#找到id内容为a3的标签,#代表id
print(soup.select('li,a'))#找到所有li标签和a标签
#属性选择器——————通过属性寻找对应的标签
print(soup.select('li[id]'))#查找到有id的li标签,存储为列表
print(soup.select('li[id="a4"]'))#查找到id属性=a4的li标签
#层级选择器——————通过层级关系寻找对应的标签
#(1)后代选择器(类似于选择父辈可以直接查询孙辈)
print(soup.select('div li'))#查询div下所有li标签,以列表形式存储,' '代表li是div的后代
#(2)子代选择器(类似于选择父辈只能查询子辈,不能跳级查询孙辈)
print(soup.select('div>ul>li'))#查询div下ul下的所有li标签,以列表形式存储,'>'代表li是ul的子代,ul是div的子代
4.节点相关
#(1)获取节点内容
obj=soup.select('#a5')#找到id内容为a5的标签,存储为列表类型
#print(obj.get_text())#通过.get_text()来获取文本内容
#上面这条直接调用会报错,是因为obj为一个列表,所以要取出列表中的字符串,才能正常运行
obj1=obj[0]
print(obj1.get_text())#通过.get_text()来获取文本内容
#如果标签对象中只有内容,那么string和get_text()都能获取到内容
#如果标签对象中除了内容还有对象,那么只有get_text()能获取到内容
print(obj1.string)
#(2)节点的属性
obj=soup.select('#p1')#找到id内容为p1的标签,存储为列表类型
obj1=obj[0]
print(obj1.name)#name返回的是标签的名字
print(obj1.attrs)#attrs是将属性值以字典形式返回
#(3)获取节点的属性
obj=soup.select('#p1')#找到id内容为p1的标签,存储为列表类型
obj1=obj[0]
print(obj1.attrs.get('class'))#因为attrs返回的是字典类型,可以用get方式
print(obj1.get['class'])
print(obj1['class'])
可能会遇到的问题
爬到中文乱码
解决办法:查看网站编码格式(注:在网页上按f12或者右键打开‘开发者工具’,在“元素”界面head标签那里找,charset=xx就是网站的编码格式),我们向网站发送请求后,换行再写上编码方式xx.encoding=’gb2312’,这时就解决了中文乱码的问题(xx如我所发的代码html_data,可以自己命名)
html_data = requests.get(url,headers)
html_data.encoding='gb2312'
获取不到标签或属性的文本内容
解决办法:加个循环,在循环里加个.text或者其它bs4的方法就可以获取到文本内容。(for循环简单用法:for xx in yy:)
for shu_data in nr:
data_shu = shu_data.text
代码:
import requests from bs4 import BeautifulSoup import time if __name__ == '__main__': url = 'https://www.thn21.com/wen/famous/13542.html' headers = { #请求信息 } html_data = requests.get(url,headers) html_data.encoding='gb2312' soup = BeautifulSoup(html_data.text,'lxml') html = soup.select('.zuo > div[id="vv"] > div[id="v"] > .td') xr = open('./xyouji.txt','w',encoding='utf8') for url_data in html: time.sleep(2) wz_url = 'https://www.thn21.com/' + url_data["href"] title = url_data.string books = requests.get(wz_url,headers) books.encoding='gb2312' data = BeautifulSoup(books.text,'lxml') nr = data.select('div[id="left"] > div[id="wen"] > p') for shu_data in nr: data_shu = shu_data.text xr.write(title+'\n'+data_shu+'\n') print(title+' '+'下载完成')
© 版权声明
THE END
暂无评论内容