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月前
|
数据采集 存储 XML
Python爬虫:深入探索1688关键词接口获取之道
在数字化经济中,数据尤其在电商领域的价值日益凸显。1688作为中国领先的B2B平台,其关键词接口对商家至关重要。本文介绍如何通过Python爬虫技术,合法合规地获取1688关键词接口,助力商家洞察市场趋势,优化营销策略。
|
1天前
|
数据采集 JSON 数据格式
Python爬虫:京东商品评论内容
京东商品评论接口为商家和消费者提供了重要工具。商家可分析评论优化产品,消费者则依赖评论做出购买决策。该接口通过HTTP请求获取评论内容、时间、点赞数等数据,支持分页和筛选好评、中评、差评。Python示例代码展示了如何调用接口并处理返回的JSON数据。应用场景包括产品优化、消费者决策辅助、市场竞争分析及舆情监测。
|
13天前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
45 3
|
24天前
|
数据采集 存储 缓存
如何使用缓存技术提升Python爬虫效率
如何使用缓存技术提升Python爬虫效率
|
25天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
1月前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
1月前
|
数据采集 存储 API
利用Python爬虫获取1688关键词接口全攻略
本文介绍如何使用Python爬虫技术合法合规地获取1688关键词接口数据,包括环境准备、注册1688开发者账号、获取Access Token、构建请求URL、发送API请求、解析HTML及数据处理存储等步骤,强调遵守法律法规和合理使用爬虫技术的重要性。
|
1月前
|
数据采集 JSON 开发者
Python爬虫京东商品详情数据接口
京东商品详情数据接口(JD.item_get)提供商品标题、价格、品牌、规格、图片等详细信息,适用于电商数据分析、竞品分析等。开发者需先注册账号、创建应用并申请接口权限,使用时需遵循相关规则,注意数据更新频率和错误处理。示例代码展示了如何通过 Python 调用此接口并处理返回的 JSON 数据。
|
2月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
2月前
|
数据采集 JavaScript 前端开发
Python爬虫能处理动态加载的内容吗?
Python爬虫可处理动态加载内容,主要方法包括:使用Selenium模拟浏览器行为;分析网络请求,直接请求API获取数据;利用Pyppeteer控制无头Chrome。这些方法各有优势,适用于不同场景。