неправильно сформированная ошибка начального тега - Python, BeautifulSoup и Sipie - Ubuntu 10.04 - PullRequest
9 голосов
/ 08 июля 2010

Я только что установил python, mplayer, beautifulsoup и sipie для запуска Sirius на моей машине с Ubuntu 10.04. Я следовал некоторым документам, которые кажутся простыми, но я сталкиваюсь с некоторыми проблемами. Я не очень знаком с Python, так что это может быть за пределами моей лиги.

Мне удалось установить все, но затем запуск sipie дает следующее:

/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

Я просмотрел эти файлы и номера строк, но, поскольку я незнаком с Python, это не имеет особого смысла. Любой совет, что делать дальше?

Ответы [ 5 ]

15 голосов
/ 30 апреля 2012

Предположим, вы используете BeautifulSoup4, я узнал что-то в официальном документе по этому поводу: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser

Если вы используете версию Python 2 ранее 2.7.3 или версию Python 3 ранее, чем 3.2.2, очень важно, чтобы вы установили lxml или html5lib - встроенный анализатор HTML в Python не очень хорош в старые версии.

Я попробовал это, и это хорошо работает, как @ Joshua

soup = BeautifulSoup(r.text, 'html5lib')
8 голосов
/ 10 февраля 2012

Проблемы, с которыми вы сталкиваетесь, довольно распространены, и они имеют дело именно с некорректным HTML.В моем случае, был элемент HTML, который дважды указывал значение атрибута.Я столкнулся с этой проблемой сегодня на самом деле, и при этом наткнулся на ваш пост.Я НАКОНЕЦ смог решить эту проблему путем анализа HTML-кода через html5lib перед передачей его BeautifulSoup 4.

Во-первых, вам необходимо:

sudo easy_install bs4
sudo apt-get install python-html5lib

Затем запустите этотпример кода:

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

Если у вас есть какие-либо вопросы по поводу этого кода или вам нужно более подробное руководство, просто дайте мне знать.:)

2 голосов
/ 16 марта 2014

Командная строка:

$ 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'])
2 голосов
/ 29 августа 2010

В новых версиях BeautifulSoup используется HTMLParser, а не SGMLParser (из-за удаления SGMLParser из стандартной библиотеки Python 3.0).В результате, BeautifulSoup больше не может корректно обрабатывать многие искаженные документы HTML, что, как я полагаю, вы встречаете здесь.

Решением вашей проблемы может быть удаление BeautifulSoup и установкаболее старая версия (которая все еще будет работать с Python 2.6 в Ubuntu 10.04LTS):

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

Имейте в виду, что это временное решение больше не будет работать с Python 3.0 (которое может стать по умолчанию в будущемверсии Ubuntu).

0 голосов
/ 08 июля 2010

Посмотрите на столбец 3 строки 100 в «данных», упомянутых в файле «/usr/bin/Sipie/Sipie/Factory.py», строка 298

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...