分享在python中使用bs4时可能会遇到的问题(附代码)

分享在python中使用bs4时可能会遇到的问题(附代码)

简单使用

在终端输入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
喜欢就支持一下吧
点赞15 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容