python爬虫之BeautifulSoup4遇坑记

简介:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
from urllib import request
from bs4 import BeautifulSoup

html = request.urlopen("https://movie.douban.com/")
bs = BeautifulSoup(html, "lxml-xml")
print(bs.title)


到目前为止,我知道的py36和37中的parser只能选择html-parser和html5lib而lxml和lxml-xml不能用


先说下经过:

1.run

2.报错如下


D:\Users\lunjiawang\wlj\devkit\anaconda\install\python.exe D:/Users/lunjiawang/PycharmProjects/script/src/Practice.py
Traceback (most recent call last):
  File "D:/Users/lunjiawang/PycharmProjects/script/src/Practice.py", line 7, in <module>
    bs = BeautifulSoup(html, "lxml-xml")
  File "D:\Users\lunjiawang\wlj\devkit\anaconda\install\lib\site-packages\bs4\__init__.py", line 198, in __init__
    % ",".join(features))
bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml-xml. Do you need to install a parser library?

Process finished with exit code 1

3.第一反应 Do you need to install a parser library?这句导致我以为自己的lxml包没有安装,故使用


pip install lxml

因为我是用的conda所以比较方便,但是这导致一个信任问题:conda真的把我要的包导进来了吗?在安装完之后还不行的情况下,我产生了这样的想法,所以开始google


4.google出来的答案基本一致:lxml版本不兼容(后来想想话是没说错,倒是容易产生迷惑),根据网上的大神(基本都是stackOverflow,github啥的),下载4.0.0的版本,用的amd64 cp35\36下载,然后用pip install 文件目录安装。不行,报错原因简单:not support in this platform

8e32d7833f1b4623bed2fc294c6ba01aa5ed9a53

5.显而易见,平台不支持,当时的想法是系统平台,而不是py平台,继续找该问题的方法

6.直到有个网友说win10 py35需要下载3.7.2之前的版本,一脸懵逼,然后我想,既然4.0.0不行,那么py35和我的37应该差别不大,有可能还是lxml版本问题(没错啊,就是迷惑了),所以下了3.7的(其实在下载4.0.0的时候我就尝试下了3.8也不行,心想不会就一墙之隔吧),满心激动,安装-报错,此时都有点郁闷了

7.继续找答案,在StackOverflow上有个家伙说他是py37的下载4.2.5 cp37版本的lxml就好了。嗯?cp37?难道?35\36\37都是lxml版本的意思?对啊,吐血,这样说,我37之前一直下载4.2.5之前的版本不是找死吗?因为没有cp37啊。

8到此未知,虽然问题没有解决,但是发现自己的方向找错了。我的lxml版本没问题,有问题的是???是什么?


9.继续寻找,到源码看看吧,发现有如下

:param features: Desirable features of the parser to be used. This
        may be the name of a specific parser ("lxml", "lxml-xml",
        "html.parser", or "html5lib") or it may be the type of markup
        to be used ("html", "html5", "xml"). It's recommended that you
        name a specific parser, so that Beautiful Soup gives you the
        same results across platforms and virtual environments.
咦,好像parser有好多个,不仅仅只有lxml嘛。难道?这个跟py版本有关?为了验证这个想法,继续google


10.狂输:

py37 Couldn't find a tree builder with the features you requested

老天不负苦心人,终于有个CSDN老哥ssITt猿写了个py36 Couldn't find a tree builder with the features you requested:的文章,既然找不到37的就用36试试呗,里面给了方法:


在报错代码中把函数参数中所有的"lxml"改成"html.parser"
例子:

bs = BeautifulSoup(r, 'lxml')
 #改成 bs = BeautifulSoup(r, 'html.parser')


11.调整,run 成功了


总结:这个过程,我一直在抱怨python怎么这么麻烦,包也没有人管理,下载个三方包还需要自己手动pip,依赖没人管理,下错了就给你error,社区(包括网站),更新的是勤快,但是有py、pip更新的勤快嘛?说不定下周我这个parser又不管用,又不知道会坑死多少人

话说回来,从这个小bug中发现自己的思路还是有点问题:首先,遇到问题马上google,这个不太好,最好的方法就是源码,看最底层的东西,如果是刚学习一个工具、语言、软件啥的,最好是从doc里面汲取最官方的东西(只是全英文理解起来不是很容易,但是很详细很完整,大家可以看我其他博客里面对es的官网翻译,最近也在逼自己看原文);其次,动手能力差,其实很早就看到有很多parser,但是因为没想到跟这个有关就没有一个个试,总期待别人给现成的答案。再者,独立思考的能力也很重要,很明显这次的逻辑应该是:conda已经帮我安装了lxml包,但是程序报包找不到,说明程序这个报错只是表象,而不能轻易相信包的版本有问题。然后应该看前面一句报错:


Couldn't find a tree builder with the features you requested: lxml-xml

找不到lxml-xml这个features,那么我的包没问题,只是features有问题,此时进入源码发现有很多features,换一个试试就完了


哎,逻辑太重要,我总是想的比较复杂,归根结底还是因为没有很好的独立思考的能力,

愿与大家共勉共进步


相关文章
|
1月前
|
数据采集 Web App开发 数据安全/隐私保护
实战:Python爬虫如何模拟登录与维持会话状态
实战:Python爬虫如何模拟登录与维持会话状态
|
2月前
|
数据采集 Web App开发 自然语言处理
新闻热点一目了然:Python爬虫数据可视化
新闻热点一目了然:Python爬虫数据可视化
|
1月前
|
数据采集 监控 数据库
Python异步编程实战:爬虫案例
🌟 蒋星熠Jaxonic,代码为舟的星际旅人。从回调地狱到async/await协程天堂,亲历Python异步编程演进。分享高性能爬虫、数据库异步操作、限流监控等实战经验,助你驾驭并发,在二进制星河中谱写极客诗篇。
Python异步编程实战:爬虫案例
|
2月前
|
数据采集 存储 XML
Python爬虫技术:从基础到实战的完整教程
最后强调: 父母法律法规限制下进行网络抓取活动; 不得侵犯他人版权隐私利益; 同时也要注意个人安全防止泄露敏感信息.
679 19
|
1月前
|
数据采集 存储 JSON
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
Python爬虫常见陷阱:Ajax动态生成内容的URL去重与数据拼接
|
1月前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
2月前
|
数据采集 存储 Web App开发
处理Cookie和Session:让Python爬虫保持连贯的"身份"
处理Cookie和Session:让Python爬虫保持连贯的"身份"
|
2月前
|
数据采集 Web App开发 前端开发
处理动态Token:Python爬虫应对AJAX授权请求的策略
处理动态Token:Python爬虫应对AJAX授权请求的策略
|
2月前
|
数据采集 网络协议 API
协程+连接池:高并发Python爬虫的底层优化逻辑
协程+连接池:高并发Python爬虫的底层优化逻辑
|
2月前
|
数据采集 监控 Shell
无需Python:Shell脚本如何成为你的自动化爬虫引擎?
Shell脚本利用curl/wget发起请求,结合文本处理工具构建轻量级爬虫,支持并行加速、定时任务、增量抓取及分布式部署。通过随机UA、异常重试等优化提升稳定性,适用于日志监控、价格追踪等场景。相比Python,具备启动快、资源占用低的优势,适合嵌入式或老旧服务器环境,复杂任务可结合Python实现混合编程。

推荐镜像

更多