2013-07-20 14 views
14

Sto usando python 2,7.5 su mac 10.7.5, beautifulsoup 4.2.1. Sto analizzando una pagina xml utilizzando la libreria lxml, come insegnato nel tutorial di beautifulsoup. Tuttavia, quando si esegue il mio codice, mostraCome reinstallare lxml?

bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: 
lxml,xml. Do you need to install a parser library? 

Sono sicuro che ho già installato lxml con tutti i metodi: easy_install, pip, portuali, ecc ho provato ad aggiungere una riga al mio codice per vedere se lxml è installato o meno:

import lxml 

Quindi python può semplicemente eseguire correttamente questo codice e visualizzare nuovamente il precedente messaggio di errore, che si verifica sulla stessa riga.

Quindi sono abbastanza sicuro che lxml è stato installato, ma non installato correttamente. Così ho deciso di disinstallare lxml e quindi reinstallarlo usando un metodo 'corretto'. Ma quando si digita in

easy_install -m lxml 

mostra:

Searching for lxml 
Best match: lxml 3.2.1 
Processing lxml-3.2.1-py2.7-macosx-10.6-intel.egg 

Using /Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/lxml- 
3.2.1-py2.7-macosx-10.6-intel.egg 

Because this distribution was installed --multi-version, before you can 
import modules from this package in an application, you will need to 
'import pkg_resources' and then use a 'require()' call similar to one of 
these examples, in order to select the desired version: 

pkg_resources.require("lxml") # latest installed version 
pkg_resources.require("lxml==3.2.1") # this exact version 
pkg_resources.require("lxml>=3.2.1") # this version or higher 

Processing dependencies for lxml 
Finished processing dependencies for lxml 

Quindi non so come continuare il mio disinstallazione ...

ho guardato molti messaggi su questo problema su google ma ancora non riesco a trovare alcuna informazione utile.

Ecco il mio codice:

import mechanize 
from bs4 import BeautifulSoup 
import lxml 

class count: 
    def __init__(self,protein): 
     self.proteinCode = protein 
     self.br = mechanize.Browser() 

    def first_search(self): 
     #Test 0 
     soup = BeautifulSoup(self.br.open("http://www.ncbi.nlm.nih.gov/protein/21225921?report=genbank&log$=prottop&blast_rank=1&RID=YGJHMSET015"), ['lxml','xml']) 
     return 

if __name__=='__main__': 
    proteinCode = sys.argv[1] 
    gogogo = count(proteinCode) 

Voglio sapere:

  1. Come posso disinstallare lxml?
  2. Come posso installare lxml 'correttamente'? Come faccio a sapere che è stato installato correttamente?

risposta

12

Sto utilizzando BeautifulSoup 4.3.2 e OS X 10.6.8. Ho anche un problema con lxml installato in modo non corretto. Qui ci sono alcune cose che ho scoperto:

Prima di tutto, controllare questa domanda correlata: Removed MacPorts, now Python is broken

Ora, al fine di verificare che i costruttori per BeautifulSoup 4 installati, provare

>>> import bs4 
>>> bs4.builder.builder_registry.builders 

Se non vedi il tuo generatore preferito, quindi non è installato, e vedrai un errore come sopra ("Impossibile trovare un costruttore di alberi ...").

Inoltre, solo perché è possibile import lxml, non significa che tutto è perfetto.

Prova

>>> import lxml 
>>> import lxml.etree 

Per capire cosa sta succedendo, passare alla installazione bs4 e aprire l'uovo (tar -xvzf). Notare i moduli bs4.builder. Al suo interno si dovrebbero vedere file come _lxml.py e _html5lib.py. Quindi puoi provare anche

>>> import bs4.builder.htmlparser 
>>> import bs4.builder._lxml 
>>> import bs4.builder._html5lib 

Se c'è un problema, vedrai perché non è possibile caricare un modulo parricolare.Si può notare come alla fine di builder/__init__.py carica tutti quei moduli e ignora tutto ciò che non è stato caricato:

# Builders are registered in reverse order of priority, so that custom 
# builder registrations will take precedence. In general, we want lxml 
# to take precedence over html5lib, because it's faster. And we only 
# want to use HTMLParser as a last result. 
from . import _htmlparser 
register_treebuilders_from(_htmlparser) 
try: 
    from . import _html5lib 
    register_treebuilders_from(_html5lib) 
except ImportError: 
    # They don't have html5lib installed. 
    pass 
try: 
    from . import _lxml 
    register_treebuilders_from(_lxml) 
except ImportError: 
    # They don't have lxml installed. 
    pass 
+1

Il suggerimento alla domanda correlata (http://stackoverflow.com/questions/14153221/removed-macports-now-python-is-broken) per disinstallare e reinstallare il problema risolto per me. –

+2

Dato che 'lxml' mancava sulla mia macchina, l'esecuzione di' sudo pip install lxml' ha risolto il problema per me. –

+1

Inoltre, questo passaggio potrebbe essere necessario quando si installa lxml: http://stackoverflow.com/questions/19548011/cannot-install-lxml-on-mac-os-x-10-9 – taylorc93

0

apt-get su Debian/Ubuntu: sudo apt-get install python3-lxml per MacOS-X, un macport di lxml è disponibile . Prova qualcosa come sudo port install py27-lxml

http://lxml.de/installation.html può essere utile.

+0

Questo non mostra come disinstallarlo correttamente. –

3

Se si utilizza Python2.7 in Ubuntu/Debian, questo ha funzionato per me:

$ sudo apt-get build-dep python-lxml 
$ sudo pip install lxml 

prova le cose come:

[email protected]:~/computer_vision/image_retrieval$ python 
Python 2.7.6 (default, Jun 22 2015, 17:58:13) 
[GCC 4.8.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import lxml 
1

FWIW, mi sono imbattuto in un problema simile (Python 3.6 , os x 10.12.6) ed è stato in grado di risolvere semplicemente facendo (primo comando è proprio per significare che stavo lavorando in un conda virtualenv):

$ source activate ml-general 
$ pip uninstall lxml 
$ pip install lxml 

Ho provato prima cose più complicate, perché BeautifulSoup funzionava correttamente con un comando identico tramite Jupyter + iPython, ma non attraverso il terminale PyCharm nella stessa virtualenv. La semplice reinstallazione di lxml come sopra ha risolto il problema.