2016-08-22 2 views
3

Я пытаюсь установить html5lib. сначала я попытался установить последнюю версию (8 или 9 девяток), но она вступила в конфликт с моим BeautifulSoup, поэтому я решил попробовать более старую версию (0.9999999, seven nines). Я установил его, но когда я пытаюсь использовать его:html5lib: TypeError: __init __() получил неожиданный аргумент ключевого слова 'encoding'

>>> with urlopen("http://example.com/") as f: 
    document = html5lib.parse(f, encoding=f.info().get_content_charset()) 

Я получаю сообщение об ошибке:

Traceback (most recent call last): 
    File "<pyshell#11>", line 2, in <module> 
    document = html5lib.parse(f, encoding=f.info().get_content_charset()) 
    File "C:\Python\Python35-32\lib\site-packages\html5lib\html5parser.py", line 35, in parse 
    return p.parse(doc, **kwargs) 
    File "C:\Python\Python35-32\lib\site-packages\html5lib\html5parser.py", line 235, in parse 
    self._parse(stream, False, None, *args, **kwargs) 
    File "C:\Python\Python35-32\lib\site-packages\html5lib\html5parser.py", line 85, in _parse 
    self.tokenizer = _tokenizer.HTMLTokenizer(stream, parser=self, **kwargs) 
    File "C:\Python\Python35-32\lib\site-packages\html5lib\_tokenizer.py", line 36, in __init__ 
    self.stream = HTMLInputStream(stream, **kwargs) 
    File "C:\Python\Python35-32\lib\site-packages\html5lib\_inputstream.py", line 151, in HTMLInputStream 
    return HTMLBinaryInputStream(source, **kwargs) 
TypeError: __init__() got an unexpected keyword argument 'encoding' 

Что не так, и что я должен делать?

ответ

6

я вижу что-то было нарушено в последних версиях html5lib в отношении BS4, html5lib.treebuilders._base больше не существует, usng BS4 4.4.1 последняя совместимая версия, кажется, одна с 7 девяток, как только вы установите его, как показано ниже он работает отлично:

pip3 install -U html5lib=="0.9999999" 

испытано с использованием BS4 4.4.1:

In [1]: import bs4 

In [2]: bs4.__version__ 
Out[2]: '4.4.1' 

In [3]: import html5lib 

In [4]: html5lib.__version__ 
Out[4]: '0.9999999' 

In [5]: from urllib.request import urlopen 

In [6]: with urlopen("http://example.com/") as f: 
    ...:   document = html5lib.parse(f, encoding=f.info().get_content_charset()) 
    ...:  

In [7]: 

вы можете увидеть изменения в этой фиксации Rename treebuilders._base to .base to reflect public status название было изменено:

Ошибка вы видите, потому что вы все еще используете самую последнюю версию, в html5lib/_inputstream.py, HTMLBinaryInputStream не имеет кодировки ARG:

class HTMLBinaryInputStream(HTMLUnicodeInputStream): 
    """Provides a unicode stream of characters to the HTMLTokenizer. 

    This class takes care of character encoding and removing or replacing 
    incorrect byte-sequences and also provides column and line tracking. 

    """ 

    def __init__(self, source, override_encoding=None, transport_encoding=None, 
       same_origin_parent_encoding=None, likely_encoding=None, 
       default_encoding="windows-1252", useChardet=True): 

Установка override_encoding = f.info() .get_content_charset() должен сделать трюк.

Также обновление до последней версии BS4 прекрасно работает с последней версией html5lib:

In [16]: bs4.__version__ 
Out[16]: '4.5.1' 

In [17]: html5lib.__version__ 
Out[17]: '0.999999999' 

In [18]: with urlopen("http://example.com/") as f: 
      document = html5lib.parse(f, override_encoding=f.info().get_content_charset()) 
    ....:  

In [19]: 
Смежные вопросы