2010-07-07 18 views
9

Właśnie zainstalowałem Pythona, mplayera, beautifulsoup i Sipie, aby uruchomić Sirius na moim komputerze z Ubuntu 10.04. Poszedłem za niektórymi dokumentami, które wydają się proste, ale napotykam pewne problemy. Nie jestem zaznajomiony z Pythonem, więc może to być poza moją ligą.nieprawidłowy błąd tagu startowego - Python, BeautifulSoup i Sipie - Ubuntu 10.04

udało mi się dostać wszystko zainstalowane, ale potem działa sipie daje to:

/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

przejrzałem tych plików i numery linii, ale ponieważ jestem zaznajomiony z Pythona, to nie ma sensu. Jakieś rady dotyczące tego, co dalej?

Odpowiedz

8

Problemy, które napotkasz, są dość powszechne i dotyczą w szczególności źle sformułowanego kodu HTML. W moim przypadku był element HTML, który dwukrotnie cytował wartość atrybutu. Wpadłem dziś na ten problem, a więc natknąłem się na twój post. I w końcu udało się rozwiązać ten problem przez parsowania HTML poprzez html5lib przed przekazaniem go wyłączyć BeautifulSoup 4.

Po pierwsze, musisz:

sudo easy_install bs4 
sudo apt-get install python-html5lib 

Następnie uruchom ten przykładowy kod:

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 

Jeśli masz pytania dotyczące tego kodu lub potrzebujesz trochę dokładniejszych wskazówek, daj mi znać.:)

+2

Otrzymuję komunikat "ValueError: Nierozpoznany konstruktor drzewa" beautifulsoup "' (Python 2.7.5, beautifulsoup 4.3.2, html5lib 0.999) –

-2

Look w kolumnie 3 linii 100 w „danych”, która jest wymieniona w pliku „/usr/bin/Sipie/Sipie/Factory.py”, linia 298

+0

Rozumiem, co masz na myśli, ale trudno mi znaleźć te dane ... Ciągle szukam. Wciąż nieznane, jak wszystkie te programy współpracują ze sobą ... Jakieś dodatkowe wskazówki? – nicorellius

2

Nowsze wersje BeautifulSoup uses HTMLParser rather than SGMLParser (ze względu na SGMLParser został usunięty z biblioteki standardowej Python 3.0). W rezultacie, BeautifulSoup nie może już poprawnie przetwarzać wielu źle sformułowanych dokumentów HTML, co uważam, że napotykasz tutaj.

Rozwiązaniem problemu może być uninstall BeautifulSoup, and install an older version (który nadal będzie pracować z Pythona 2.6 na Ubuntu 10.04LTS):

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

Wystarczy mieć świadomość, że to tymczasowe rozwiązanie nie będzie już pracować z Pythona 3.0 (co może stać się domyślną wersją w przyszłych wersjach Ubuntu).

15

Załóżmy używasz BeautifulSoup4, znalazłem coś w oficjalnym dokumencie na ten temat: 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.

Próbowałem to i to działa dobrze, tak jak co @Joshua

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

+1, good find !! –

+0

Czy to "r" w powyższym kodzie jest obiektem html z biblioteki żądań? Bez względu na przypadek, ten wielki oneliner działa jak urok przy użyciu biblioteki pycurl. +1 – FredTheWebGuy

+1

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

2

Linia komend:

$ 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 Otrzymuję również zniekształcony komunikat znacznika początkowego, ale muszę przeanalizować plik html zapisany na dysku, a nie otwarty adres URL. Czy jest jakiś sposób na zrobienie tego? – ShaunO

+0

Po prostu otworzysz plik zamiast używać urlopen. 'page = open ('twój/plik/ścieżka /')' –

Powiązane problemy