urlparse: ModuleNotFoundError, предположительно в Python2.7 и под conda
Я пытаюсь запустить свой собственный проект Scrapy. Код основан на хорошо написанной книге, и автор предоставляет отличную игровую площадку для запуска сценариев, описанных в книге. В ВМ код работает нормально. Однако, пытаясь практиковать самостоятельно, я получил следующую ошибку:
File "(frozen importlib._bootstrap)", line 978, in _gcd_import
File "(frozen importlib._bootstrap)", line 961, in _find_and_load
File "(frozen importlib._bootstrap)", line 950, in _find_and_load_unlocked
File "(frozen importlib._bootstrap)", line 655, in _load_unlocked
File "(frozen importlib._bootstrap_external)", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
File "C:\users\me\dictionary_com\spiders\basic.py", line 3, in <module>
import urlparse
ModuleNotFoundError: No module named 'urlparse'
Первоначально у меня был Python 3, работающий на моей основной внешней машине (вне виртуальной машины), и кажется, что автор использовал Python 2 (до сих пор не знаю, как в этом понималась пластинка 8 редактора Atom?). После рассмотрения проблем Python 2/3 с urllib, ( python 2 и 3 извлекают домен из журналов url и Heroku, когда я использую import urlparse и https://github.com/FriendCode/gittle/issues/49, при использовании import urlparse и https://github.com/FriendCode/gittle/issues/49) Я пробовал различные решения импорта, представленные в этих ссылках. Я установил Python 2.7 (и проверил, что он установлен в path с помощью $python -V ->python2.7.13. Я даже попытался создать среду conda, чтобы убедиться, что она вытягивает python2.7.13.
Мой скрипт spider.py выглядит следующим образом:
import datetime
import urlparse
import socket
import scrapy
from Terms.items import TermsItem
# you have to import processors from scrapy.loader to use it
from scrapy.loader.processors import MapCompose, Join
# you have to import Itemloader from scrapy.loader to use it
from scrapy.loader import ItemLoader
class BasicSpider(scrapy.Spider):
name = "basic"
allowed_domains = ["web"]
start_urls = [i.strip() for i in open('lused.urls.txt').readlines()]
def parse(self, response):
l = ItemLoader(item=TermsItem(), response=response)
# Load fields using XPath expressions
l.add_xpath('term', '//h1[@class="head-entry"][1]/text()',
MapCompose(unicode.strip, unicode.title))
l.add_xpath('definition', '//*[@class="def-list"][1]/text()',
MapCompose(unicode.strip, unicode.title))
# Housekeeping fields
l.add_value('url', response.url)
l.add_value('project', self.settings.get('BOT_NAME'))
l.add_value('spider', self.name)
l.add_value('server', socket.gethostname())
l.add_value('date', datetime.datetime.now())
return l.load_item()
Мой скрипт item.py выглядит следующим образом:
from scrapy.item import Item, Field
class TermsItem(Item):
# Primary fields
term = Field()
definition = Field()
# Housekeeping fields
url = Field()
project = Field()
spider = Field()
server = Field()
date = Field()
В редакторе атомов флаг / подчеркивание программы проверки на python flake8 (добавляется: "импортировано, но не используется):
'import urlparse'
'из scrapy.loader.processors import MapCompose, Join'
Однако, когда я открываю практически идентичный код, используемый в предоставленной автором виртуальной машине в редакторе Atom, он ничего не помечает... и код выполняется!!??
К сожалению, я остался с тем же результатом ошибки после попытки вышеуказанных попыток решения. Я надеялся, что кто-то еще столкнулся с этой проблемой или может обнаружить мою ошибку на основе вышеупомянутых деталей.
1 ответ
Я (частично) решил проблему с благодарным руководством от Мартина Питтерса. Scrapy расширял мою систему с установленным Python - Python 3.6- вместо моей среды conda python -Python 2.7. Основываясь на документации по установке http://conda.io/docs/user-guide/tasks/manage-environments.htm%E2%80%8C%E2%80%8Bl и miniconda, добавление miniconda в PATH может привести к тому, что среда miniconda будет вызываться раньше других сред (если я правильно понимаю). Кажется, мне нужно использовать терминал Anaconda для создания среды conda. Первоначально я использовал терминал powershell (полагая, что добавления миниконды на путь было достаточно). Надеюсь, я достаточно искусно объяснил это, чтобы другие могли избежать моей ошибки.
С Уважением,