#!/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
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')
总结:这个过程,我一直在抱怨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,换一个试试就完了
哎,逻辑太重要,我总是想的比较复杂,归根结底还是因为没有很好的独立思考的能力,
愿与大家共勉共进步