2010-07-07 10 views
9

Je viens d'installer python, mplayer, beautifulsoup et sipie pour exécuter Sirius sur ma machine Ubuntu 10.04. J'ai suivi quelques documents qui semblent simples, mais je rencontre quelques problèmes. Je ne suis pas très familier avec Python, donc cela peut être hors de ma ligue.Erreur de balise de début mal formée - Python, BeautifulSoup et Sipie - Ubuntu 10.04

j'ai pu obtenir tout installé, mais SIPIE en cours d'exécution donne ceci:

/usr/bin/Sipie/Sipie/Config.py:12: DeprecationWarning: the md5 module is deprecated; use hashlib instead import md5
Traceback (most recent call last): File "/usr/bin/Sipie/sipie.py", line 22, in <module> Sipie.cliPlayer()
File "/usr/bin/Sipie/Sipie/cliPlayer.py", line 74, in cliPlayer completer = Completer(sipie.getStreams())
File "/usr/bin/Sipie/Sipie/Factory.py", line 374, in getStreams streams = self.tryGetStreams()
File "/usr/bin/Sipie/Sipie/Factory.py", line 298, in tryGetStreams soup = BeautifulSoup(data)
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup-3.1.0.1-py2.6.egg/BeautifulSoup.py", line 1499, in __init__ BeautifulStoneSoup.__init__(self, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup-3.1.0.1-py2.6.egg/BeautifulSoup.py", line 1230, in __init__ self._feed(isHTML=isHTML)
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup-3.1.0.1-py2.6.egg/BeautifulSoup.py", line 1263, in _feed self.builder.feed(markup)
File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed self.goahead(0)
File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead k = self.parse_starttag(i)
File "/usr/lib/python2.6/HTMLParser.py", line 226, in parse_starttag endpos = self.check_for_whole_start_tag(i)
File "/usr/lib/python2.6/HTMLParser.py", line 301, in check_for_whole_start_tag self.error("malformed start tag")
File "/usr/lib/python2.6/HTMLParser.py", line 115, in error raise HTMLParseError(message, self.getpos())
HTMLParser.HTMLParseError: malformed start tag, at line 100, column 3

Je regardé à travers ces fichiers et les numéros de ligne, mais depuis que je suis peu familier avec Python, il ne fait pas beaucoup de sens. Des conseils sur quoi faire ensuite?

Répondre

8

Les problèmes que vous rencontrez sont assez fréquents, et ils traitent spécifiquement du HTML mal formé. Dans mon cas, il y avait un élément HTML qui avait une double citation de la valeur d'un attribut. Je me suis heurté à ce problème aujourd'hui et, ce faisant, je suis tombé sur votre message. J'ai finalement pu résoudre ce problème grâce à l'analyse du HTML par html5lib avant de le remettre au large de la BeautifulSoup 4.

Tout d'abord, vous devez:

sudo easy_install bs4 
sudo apt-get install python-html5lib 

Ensuite, exécutez cet exemple de code:

from bs4 import BeautifulSoup 
import html5lib 
from html5lib import sanitizer 
from html5lib import treebuilders 
import urllib 

url = 'http://the-url-to-scrape' 
fp = urllib.urlopen(url) 

# Create an html5lib parser. Not sure if the sanitizer is required. 
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"), tokenizer=sanitizer.HTMLSanitizer) 
# Load the source file's HTML into html5lib 
html5lib_object = parser.parse(file_pointer) 
# In theory we shouldn't need to convert this to a string before passing to BS. Didn't work passing directly to BS for me however. 
html_string = str(html5lib_object) 

# Load the string into BeautifulSoup for parsing. 
soup = BeautifulSoup(html_string) 

for content in soup.findAll('div'): 
    print content 

Si vous avez des questions sur ce code ou avez besoin d'un peu plus de conseils spécifiques, faites le moi savoir.:)

+2

Je reçois 'ValueError: treebuilder non reconnu" beautifulsoup "' (Python 2.7.5, beautifulsoup 4.3.2, html5lib 0.999) –

-2

Regard sur la colonne 3 de la ligne 100 dans les « données » qui est mentionné dans le fichier « /usr/bin/Sipie/Sipie/Factory.py », ligne 298

+0

Je vois ce que vous voulez dire, mais j'ai du mal à trouver ces données ... Toujours en train de chercher. Encore peu familier comment tous ces programmes fonctionnent ensemble ... Des conseils supplémentaires? – nicorellius

2

Les nouvelles versions de BeautifulSoup uses HTMLParser rather than SGMLParser (en raison de SGMLParser étant supprimé de la bibliothèque standard Python 3.0). En conséquence, BeautifulSoup ne peut plus traiter correctement de nombreux documents HTML malformés, ce que je crois que vous rencontrez ici.

Une solution à votre problème est susceptible d'être à uninstall BeautifulSoup, and install an older version (qui fonctionne toujours avec Python 2.6 sur Ubuntu 10.04LTS):

sudo apt-get remove python-beautifulsoup 
sudo easy_install -U "BeautifulSoup==3.0.7a" 

Il faut juste savoir que cette solution temporaire ne fonctionnera plus avec Python 3.0 (qui peut devenir la valeur par défaut dans les futures versions d'Ubuntu).

15

Supposons que vous utilisez BeautifulSoup4, j'ai découvert quelque chose dans le document officiel à ce sujet: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser

If you’re using a version of Python 2 earlier than 2.7.3, or a version of Python 3 earlier than 3.2.2, it’s essential that you install lxml or html5lib–Python’s built-in HTML parser is just not very good in older versions.

J'ai essayé et il fonctionne bien, comme ce @Joshua

soup = BeautifulSoup(r.text, 'html5lib') 
+1

+1, bonne trouvaille !! –

+0

Est-ce que ce "r" dans le code ci-dessus est un objet html de la bibliothèque de requêtes? Peu importe le cas, ce grand oneliner fonctionne aussi comme un charme en utilisant la bibliothèque pycurl. +1 – FredTheWebGuy

+1

@Dreadful_Code: r = requests.get (url) – dannyroa

2

ligne de commande:

$ pip install beautifulsoup4 
$ pip install html5lib 

Python 3:

from bs4 import BeautifulSoup 
from urllib.request import urlopen 

url = 'http://www.example.com' 
page = urlopen(url) 
soup = BeautifulSoup(page.read(), 'html5lib') 
links = soup.findAll('a') 

for link in links: 
    print(link.string, link['href']) 
+0

@ Ryan Allen Je reçois également le message de balise de début mal formé, mais je dois analyser un fichier html enregistré sur le disque, et non une URL ouverte. Y a-t-il un moyen de faire cela? – ShaunO

+0

Vous devez simplement ouvrir le fichier au lieu d'utiliser urlopen. 'page = open ('votre/fichier/chemin /')' –