web-dev-qa-db-ja.com

lxml / BeautifulSoupパーサー警告

Python 3を使用して、私はここで説明されているようにBeautifulSoupでlxmlを使用して醜いHTML(私の制御下にありません)を解析しようとしています: http:/ /lxml.de/elementsoup.html

具体的には、lxmlを使用したいのですが、BeautifulSoupを使用したいと思います。これは、言ったように、HTMLが醜く、lxmlはそれ自体で拒否するためです。

上記のリンクは言う:「あなたがする必要があるすべてはそれをfromstring()関数に渡すことです:」

from lxml.html.soupparser import fromstring
root = fromstring(tag_soup)

それが私がやっていることです:

URL = 'http://some-place-on-the-internet.com'
html_goo = requests.get(URL).text
root = fromstring(html_goo)

それは機能しますその後、HTMLをうまく操作できるという意味です。私の問題は、スクリプトを実行するたびに次の迷惑な警告が表示されることです。

/usr/lib/python3/dist-packages/bs4/__init__.py:166: 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))

私の問題はおそらく明白です。自分でBeautifulSoupをインスタンス化するのではありません。提案されたパラメーターをfromstring関数に追加しようとしましたが、それだけでエラーが発生しました:TypeError: 'str' object is not callable。これまでのところ、オンラインでの検索は効果がないことが証明されています。

その警告メッセージを取り除きたいのですが。感謝します、事前に感謝します。

7
Teekin

これを理解するには、lxmlとBeautifulSoupのソースコードを読む必要がありました。

将来誰かがそれを必要とするかもしれないので、私はここに自分の答えを投稿しています。

問題のfromstring関数は次のように定義されています。

def fromstring(data, beautifulsoup=None, makeelement=None, **bsargs):

**bsargs引数は、BeautifulSoupコンストラクターに転送されることになります。このコンストラクターは、次のように呼び出されます(別の関数では_parse):

tree = beautifulsoup(source, **bsargs)

BeautifulSoupコンストラクタは次のように定義されています。

def __init__(self, markup="", features=None, builder=None,
             parse_only=None, from_encoding=None, exclude_encodings=None,
             **kwargs):

次に、質問の警告に戻ります。これは、引数「html.parser」をBeautifulSoupのコンストラクタに追加することを推奨しています。これによると、それはfeaturesという名前の引数になります。

fromstring関数はBeautifulSoupのコンストラクターに名前付き引数を渡すため、次のようにfromstring関数の引数に名前を付けることでパーサーを指定できます。

root = fromstring(clean, features='html.parser')

ひどい。警告が消えます。

7
Teekin

以下のような他のinitについて:

soup = BeautifulSoup(html_doc)

使用する

soup = BeautifulSoup(html_doc, 'html.parser')

代わりに

7
Windsooon

BeautifulSoupを使用している間、私たちは常に以下のようなことを行います。

[変数] = BeautifulSoup([分析するコンテンツ])

ここに問題があります:

以前に "lxml"をインストールしたことがある場合、BeautifulSoupはそれを使用していたことを自動的に認識します。エラーではなく通知です。

それを削除するにはどうすればよいですか?

以下のようにしてください:

[変数] = BeautifulSoup([分析するコンテンツ] 、features = "lxml"

「BeautifulSoupの最新バージョン4.6.3に基づく」

BeautifulSoupのバージョンによって、このパターンを追加する方法や文法が異なることに注意してください。通知メッセージをよく見てください。

幸運を!

1
Jaylin