2016-08-15 2 views
4

Mein Code ...Python lxml.html.soupparser.fromstring Anhebung lästige Warnung

foo = fromstring(my_html) 

es diese Warnung wirft ...

UserWarning: No parser was explicitly specified, so I'm using the best available HTML parser for this system ("html.parser"). This usually isn't a problem, but if you run this code on another system, or in a different virtual environment, it may use a different parser and behave differently. 

To get rid of this warning, change this: 

BeautifulSoup([your markup]) 

to this: 

BeautifulSoup([your markup], "html.parser") 

    markup_type=markup_type)) 

Ich habe versucht, es die Zeichenfolge 'html.parser' vorbei, aber das funktioniert nicht, da es mir einen Fehler gibt, der besagt, dass die Zeichenfolge nicht aufrufbar ist, also habe ich html.parser ausprobiert und dann habe ich durch das lxml-Modul geschaut, um zu sehen, ob ich einen anderen Parser finden konnte und nicht konnte. Ich schaute durch die Python stdlib und sah, dass in 2.7 gibt es eine namens HTMLParser, also importierte ich das und geben Sie die beautifulsoup=HTMLParser und das hat auch nicht funktioniert.

Wo ist die aufrufbar, die ich an fromstring weitergeben sollte?

EDIT hinzugefügt versucht, Lösungen:

from lxml.html.soupparser import fromstring 
wiktionary_page = fromstring(wiktionary_page.read(), features="html.parser") 

und dieses

from lxml.html.soupparser import BeautifulSoup 
wiktionary_page = fromstring(wiktionary_page.read(), beautifulsoup=lambda s: BeautifulSoup(s, "html.parser")) 

Antwort

4

Sie die Funktionen Schlüsselwort übergeben kann, die den Parser eingestellt werden.

tree = lxml.html.soupparser.fromstring("<p>foo</p>", features="html.parser") 

Was in vonString passiert ist _parser aufgerufen wird, aber ich denke, es ist ein Fehler in der Leitung ist bsargs [ 'Features'] = [ 'html.parser'], soll es bsargs['features'] = 'html.parser' sein :

def _parse(source, beautifulsoup, makeelement, **bsargs): 
    if beautifulsoup is None: 
     beautifulsoup = BeautifulSoup 
    if hasattr(beautifulsoup, "HTML_ENTITIES"): # bs3 
     if 'convertEntities' not in bsargs: 
      bsargs['convertEntities'] = 'html' 
    if hasattr(beautifulsoup, "DEFAULT_BUILDER_FEATURES"): # bs4 
     if 'features' not in bsargs: 
      bsargs['features'] = ['html.parser'] # use Python html parser 
    tree = beautifulsoup(source, **bsargs) 
    root = _convert_tree(tree, makeelement) 
    # from ET: wrap the document in a html root element, if necessary 
    if len(root) == 1 and root[0].tag == "html": 
     return root[0] 
    root.tag = "html" 
    return root 

Sie auch eine Lambda verwenden:

from lxml.html.soupparser import BeautifulSoup 
import lxml.html.soupparser 

tree = lxml.html.soupparser.fromstring("<p>foo</p>", beautifulsoup=lambda s: BeautifulSoup(s, "html.parser")) 

Beide Warnungen unterdrücken:

In [13]: from lxml.html import soupparser 

In [14]: tree = soupparser.fromstring("<p>foo</p>", features="html.parser") 
In [15]: from lxml.html.soupparser import BeautifulSoup 

In [16]: import lxml.html.soupparser 


In [17]: tree = lxml.html.soupparser.fromstring("<p>foo</p>", beautifulsoup=lambda s: BeautifulSoup(s, "html.parser")) 
+0

gute Ideen, aber für mich – deltaskelta

+0

Beide arbeiten für mich beides nicht funktioniert hat, sind Sie es genau mit so geschrieben? –

+0

Ich fügte hinzu, was ich versuchte, funktionell identisch mit Ihrem, so weit ich sagen kann – deltaskelta

Verwandte Themen