鱼C论坛

 找回密码
 立即注册
查看: 1348|回复: 14

[已解决]requests和bs4爬取电影top250

[复制链接]
发表于 2020-6-29 10:11:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 今天的我更强了 于 2020-6-29 10:14 编辑

import requests
import bs4
url='https://movie.douban.com/top250'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
res=requests.get(url,headers=headers)
soup=bs4.BeautifulSoup(res.text,'html.parser')
targets=soup.find_all('div',class_='hd')
for each in targets:
    print(each.a.span.text)
这个代码只会把电影名称爬取下来
改成这样:
targets=soup.find_all('span',class_='title')
for each in targets:
    print(each.text)
却会把下面的英文爬取下来


审查元素如下:
<div class="hd">
                        <a  class="">
                            <span class="title">肖申克的救赎</span>
                                    <span class="title">&nbsp;/&nbsp;The Shawshank Redemption</span>
                                <span class="other">&nbsp;/&nbsp;月黑高飞(港)  /  刺激1995(台)</span>
                        </a>


                            <span class="playable">[可播放]</span>
                    </div>
第一个为什么不会打印英文字母?求大佬指教
最佳答案
2020-6-29 10:44:58
本帖最后由 Twilight6 于 2020-6-29 10:49 编辑

print(each.a.span.text)


这样的用法就是只打印第一个

print(each.text)


这样是把你变量到each 标签里的 文本内容全部打印

beautifulsoup4 这样使用时候 相同的标签只能获取第一个符合要求的标签,你第一个指定的div 里面 span 标签 ,而第二个指定的是 span 标签

而span 标记都是同缩进的 也就是说他们每一个都算第一个符号要求的标签

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-29 10:14:24 | 显示全部楼层
哈哈哈  你怎么又这样发图了   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 10:15:02 | 显示全部楼层
Twilight6 发表于 2020-6-29 10:14
哈哈哈  你怎么又这样发图了

我想发截图却不会..所以重新编辑了一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:24:37 | 显示全部楼层
第一个找到的是class为hd的div标签,打印的是div的子a标签的第一个子span标签的text。
第二个则是直接找到的class为title的span标签,打印出来的text就是标题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 10:33:13 | 显示全部楼层
qiuyouzhi 发表于 2020-6-29 10:24
第一个找到的是class为hd的div标签,打印的是div的子a标签的第一个子span标签的text。
第二个则是直接找到 ...

就是说第一种方式只会打印第一个而第二种方式会全部打印吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:44:58 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Twilight6 于 2020-6-29 10:49 编辑

print(each.a.span.text)


这样的用法就是只打印第一个

print(each.text)


这样是把你变量到each 标签里的 文本内容全部打印

beautifulsoup4 这样使用时候 相同的标签只能获取第一个符合要求的标签,你第一个指定的div 里面 span 标签 ,而第二个指定的是 span 标签

而span 标记都是同缩进的 也就是说他们每一个都算第一个符号要求的标签

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 10:54:17 | 显示全部楼层
Twilight6 发表于 2020-6-29 10:44
这样的用法就是只打印第一个

懂了  谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 10:54:59 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 11:22:54 | 显示全部楼层

大佬 我能再问一下:
import requests
import bs4
url='https://movie.douban.com/top250'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'}
res=requests.get(url,headers=headers)
soup=bs4.BeautifulSoup(res.text,'html.parser')

targets=soup.find_all('a')
print(targets)
for each in targets:
    print(each.span.text)
这个地方换成a 为什么'NoneType' object has no attribute 'text' 会这样报错?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 11:24:55 | 显示全部楼层
今天的我更强了 发表于 2020-6-29 11:22
大佬 我能再问一下:
import requests
import bs4

因为没爬取到你的 each标签里的 span 导致 返回的是 None  也就是 each.span.text 变成了 None.text 而 None没有 text用法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 12:08:01 | 显示全部楼层
Twilight6 发表于 2020-6-29 11:24
因为没爬取到你的 each标签里的 span 导致 返回的是 None  也就是 each.span.text 变成了 None.text 而 N ...

可是为什么会爬取不到span 呢?  那个targets是可以打印的啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 12:39:41 | 显示全部楼层
今天的我更强了 发表于 2020-6-29 12:08
可是为什么会爬取不到span 呢?  那个targets是可以打印的啊

不是所有标签都含有这个节点,你遍历到其中一个不含有就会报错
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 14:28:31 | 显示全部楼层
Twilight6 发表于 2020-6-29 12:39
不是所有标签都含有这个节点,你遍历到其中一个不含有就会报错

所以说在写的时候多写几个父亲标签就是为了防止这种情况嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-29 14:31:43 | 显示全部楼层
今天的我更强了 发表于 2020-6-29 14:28
所以说在写的时候多写几个父亲标签就是为了防止这种情况嘛?

不一定, 常常多写反而会更容易照成这种错误,因为越多节点导致有些地方没有的概率越大

解决方法要么就放 if 判断,跳过是 None  要么就观察好节点信息,填入肯定能找到这些元素的节点信息
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-29 14:33:26 | 显示全部楼层
Twilight6 发表于 2020-6-29 14:31
不一定, 常常多写反而会更容易照成这种错误,因为越多节点导致有些地方没有的概率越大

解决方法要么 ...

好的 谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-20 07:14

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表