使用BeautifulSoup ImportError的Appengine上的Python:没有名为bs4的模块

使用BeautifulSoup ImportError的Appengine上的Python:没有名为bs4的模块,python,google-app-engine,python-2.7,beautifulsoup,Python,Google App Engine,Python 2.7,Beautifulsoup,EDIT2:解决了!请参阅下面关于正确导入的答案从lib.bs4导入美化组而不是从bs4导入美化组 编辑:将bs4放在项目的根目录中似乎可以解决问题;然而,它不是一个理想的结构。所以,我将这个问题保留下来,以尝试找到一个更可靠的解决方案 这个问题的一个变体在过去被提出过,但那里的解决方案似乎不起作用。老实说,我不确定这是因为BeautifulSoup还是Appengine的变化 见:,和 提出的解决方案似乎是将第三方库添加到项目根目录中的libs文件夹中,然后将以下内容添加到主应用程序中: im

EDIT2:解决了!请参阅下面关于正确导入的答案<代码>从lib.bs4导入美化组而不是从bs4导入美化组

编辑:将bs4放在项目的根目录中似乎可以解决问题;然而,它不是一个理想的结构。所以,我将这个问题保留下来,以尝试找到一个更可靠的解决方案

这个问题的一个变体在过去被提出过,但那里的解决方案似乎不起作用。老实说,我不确定这是因为BeautifulSoup还是Appengine的变化

见:,和

提出的解决方案似乎是将第三方库添加到项目根目录中的libs文件夹中,然后将以下内容添加到主应用程序中:

import sys
sys.path.insert(0, 'libs')
目前,我的结构如下:

ntj-test
├── lib
│   └── bs4 
├── templates
├── main.py
├── get_data.py 
└── app.yaml
这是我的app.yaml:

application: ntj-test
version: 1
runtime: python27
api_version: 1
threadsafe: yes

handlers:
- url: /favicon\.ico
  static_files: favicon.ico
  upload: favicon\.ico

- url: .*
  script: main.app

libraries:
- name: webapp2
  version: latest
- name: jinja2
  version: latest
这是我的main.py:

import webapp2
import jinja2
import get_data
import sys

sys.path.insert(0, 'lib')

JINJA_ENVIRONMENT = jinja2.Environment(
    loader=jinja2.FileSystemLoader('templates'),
    extensions=['jinja2.ext.autoescape'],
    autoescape=True,
)


class MainHandler(webapp2.RequestHandler):
    def get(self):

        teamName = get_data.all_coach_data()[1]
        coachName = get_data.all_coach_data()[2]
        teamKey = get_data.all_coach_data()[0]

        values = {
            'coachName': coachName,
            'teamName': teamName,
            'teamKey': teamKey,
        }

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(values))

app = webapp2.WSGIApplication([
    ('/', MainHandler)
], debug=True)
get_data.py将正确的数据返回给我的变量以填充值,我已在调试器中对此进行了验证

在我的开发环境中启动main.py时出现了问题(我还没有上传到gcloud)。毫无疑问,不管我通过上述链接或谷歌搜索发现了什么妙招,终端总是返回:

Import Error: No module named bs4
在上面的一个SO链接中,一位评论员说“GAE只支持纯Python模块。bs4不是纯Python模块,因为某些部分是用C编写的。”我不确定这是否正确,也不确定如何验证它。我没有足够的声誉去评论以找出答案(

我浏览了Crumy网站上的bs4文档,阅读了所有相关的SO问题和答案,并尝试从Appengine的文档中收集线索。但是,我无法找到一个不涉及使用已弃用版本的BeautifulSoup的解决方案,该版本没有我需要的功能

我是一名编程和使用StackOverflow的初学者,因此如果我遗漏了一些重要信息,或者没有遵循问题的良好实践,请告诉我。我将在必要时编辑和添加其他信息

谢谢大家!

编辑: 我不确定get_数据代码是否过份,但这里是:

from bs4 import BeautifulSoup
import urllib2, re

teamKeys = {
    'ATL': 'Atlanta Falcons',
    'HOU': 'Houston Texans',
}

def get_all_coaches():
    for key in teamKeys:
        page = urllib2.urlopen("http://www.nfl.com/teams/coaches?coaType=head&team=" + key)
        soup = BeautifulSoup(page)
        return(head_coach(soup))

def head_coach(soup):
    head = soup.select('.coachprofiletext p')[0].text
    position, name = re.split(': ', head)
    return name

def export_coach_data():
    testList = []
    for key in teamKeys:
        page = urllib2.urlopen("http://www.nfl.com/teams/coaches?coaType=head&team=" + key)
        soup = BeautifulSoup(page)
        teamKey = key
        teamName = teamKeys[key]
        headCoach = head_coach(soup)

        t = [
            teamKey,
            teamName,
            str(headCoach),
        ]

        testList.append(t)

    return(testList)

def all_coach_data():
    results = data.export_coach_data()

    ATL = results[0]
    HOU = results[1]

    return ATL
我想指出的是,这可能是由于执行不力造成的(我在业余时间只认真开发了几个月),但它确实会将正确的值返回到主要变量中

以下是Appengine启动器日志:

2014-11-05 15:36:53 Running command: "['C:\\Python27\\pythonw.exe', 'C:\\Program Files\\Google\\Cloud SDK\\google-cloud-sdk\\platform\\google_appengine\\dev_appserver.py', '--skip_sdk_update_check=yes', '--port=11080', '--admin_port=8003', u'G:\\projects\\coaches']"
INFO     2014-11-05 15:37:00,119 devappserver2.py:725] Skipping SDK update check.
WARNING  2014-11-05 15:37:00,157 api_server.py:383] Could not initialize images API; you are likely missing the Python "PIL" module.
INFO     2014-11-05 15:37:00,190 api_server.py:171] Starting API server at: http://localhost:19713
INFO     2014-11-05 15:37:00,210 dispatcher.py:183] Starting module "default" running at: http://localhost:11080
INFO     2014-11-05 15:37:00,216 admin_server.py:117] Starting admin server at: http://localhost:8003
ERROR    2014-11-05 20:37:48,726 wsgi.py:262] 

Traceback (most recent call last):

  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 239, in Handle

    handler = _config_handle.add_wsgi_middleware(self._LoadHandler())

  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 298, in _LoadHandler

    handler, path, err = LoadObject(self._handler)

  File "C:\Program Files\Google\Cloud SDK\google-cloud-sdk\platform\google_appengine\google\appengine\runtime\wsgi.py", line 84, in LoadObject

    obj = __import__(path[0])

  File "G:\projects\coaches\main.py", line 3, in <module>

    import get_data

  File "G:\projects\coaches\get_data.py", line 1, in <module>

    from bs4 import BeautifulSoup

ImportError: No module named bs4

INFO     2014-11-05 15:37:48,762 module.py:652] default: "GET / HTTP/1.1" 500 -
2014-11-05 15:36:53运行命令:“['C:\\Python27\\pythonw.exe','C:\\Program Files\\Google\\Cloud SDK\\Google Cloud SDK\\platform\\Google\u appengine\\dev\u appserver.py','--skip\u SDK\u update\u check=yes','--port=11080','--admin\u port=8003',u'G:\\projects\\coach'”
INFO 2014-11-05 15:37:00119 devappserver2.py:725]正在跳过SDK更新检查。
警告2014-11-05 15:37:00157 api_server.py:383]无法初始化图像api;您可能缺少Python“PIL”模块。
INFO 2014-11-05 15:37:00190 api_服务器。py:171]正在以下位置启动api服务器:http://localhost:19713
INFO 2014-11-05 15:37:00210 dispatcher.py:183]启动模块“默认”运行时间:http://localhost:11080
信息2014-11-05 15:37:00216管理服务器。py:117]正在以下位置启动管理服务器:http://localhost:8003
错误2014-11-05 20:37:48726 wsgi.py:262]
回溯(最近一次呼叫最后一次):
文件“C:\Program Files\Google\Cloud SDK\Google Cloud SDK\platform\Google\u appengine\Google\appengine\runtime\wsgi.py”,第239行,在句柄中
handler=\u config\u handle.add\u wsgi\u中间件(self.\u LoadHandler())
LoadHandler中的文件“C:\Program Files\Google\Cloud SDK\Google Cloud SDK\platform\Google\appengine\Google\appengine\runtime\wsgi.py”,第298行
处理程序,路径,err=LoadObject(self.\u处理程序)
LoadObject中的文件“C:\Program Files\Google\Cloud SDK\Google Cloud SDK\platform\Google\u appengine\Google\appengine\runtime\wsgi.py”,第84行
obj=\uuuuuuuuuuuuuu导入(路径[0])
文件“G:\projects\coach\main.py”,第3行,在
导入get_数据
文件“G:\projects\coach\get\u data.py”,第1行,在
从bs4导入BeautifulSoup
ImportError:没有名为bs4的模块
INFO 2014-11-05 15:37:48762 module.py:652]默认值:“GET/HTTP/1.1”500-

我认为您的问题是main.py中的输入错误:

sys.path.insert(0, 'lib')

您的目录是
libs
,而不是
lib

好的,还有一些其他修复程序。请在app.yaml的库下导入lxml:

libraries:
- name: lxml
  version: "2.3" <<- do NOT use "latest"

编辑:有人指出这是一个有点黑客行为。如果是这样的话,该如何修改此解决方案,使其不需要重命名BS4内部的模块

上的几个用户帮我解决了这个问题

通过扩展Lipis提出的解决方案,我们在main.py中添加了以下内容:

import os, sys

rootdir = os.path.dirname(os.path.abspath(__file__))
lib = os.path.join(rootdir, 'lib')
sys.path.append(lib)
然后,这里是没有人在这里或任何其他SO答案中提到的,我在所有导入语句中添加了“lib.bs4”,如下所示:

from lib.bs4 import BeautifulSoup
但是,不仅如此,在bs4库本身中还有对
bs4
的引用,因此我搜索了所有这些引用,并将它们替换为
lib.bs4.

现在,我的应用程序终于运行了,结构也组织好了。所有的功劳都归和了

希望这篇文章能帮助其他陷入类似困境的人。也许所有的导入都需要添加到导入语句中是显而易见的,但从所有的答案来看,这并不是显而易见的


感谢所有帮助排除故障的人!

或者,您可以创建一个名为
appengine_config.py
的文件来加载第三方LIB。该文件将在启动新实例时加载

import sys
import os.path
# add `lib` subdirectory to `sys.path`, so our `main` module can load third-party libraries.
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))

您实际上是如何进行导入的?“从bs4导入BeautifulSoup”?您可以手动解析HTML或通过查找模式提取您正在查找的内容。您在哪里进行导入的代码?以及如何“启动”main.py。您不像“python main.py”那样运行它,是吗?
import sys
import os.path
# add `lib` subdirectory to `sys.path`, so our `main` module can load third-party libraries.
sys.path.insert(0, os.path.join(os.path.dirname(__file__), 'lib'))