美しいスープ-美しいオブジェクト
BeautifulSoupプロジェクトの開始点は、BeautifulSoupオブジェクトです。BeautifulSoupオブジェクトは、その作成に使用される入力HTML / XMLドキュメントを表します。
Beautiful Soupには、文字列またはファイルのようなオブジェクトを渡すことができます。ファイル(オブジェクト)は、マシンまたはWebページにローカルに保存されます。
最も一般的なBeautifulSoupオブジェクトは次のとおりです。
- Tag
- NavigableString
- BeautifulSoup
- Comment
オブジェクトが等しいかどうかを比較する
美しいスープのように、2つのナビゲート可能な文字列またはタグオブジェクトは、同じHTML / XMLマークアップを表す場合は同じです。
次に、2つの<b>タグが、オブジェクトツリーの異なる部分に存在していても、どちらも「<b> Java </ b>」のように見えるため、同等として扱われる以下の例を見てみましょう。
>>> markup = "<p>Learn Python and <b>Java</b> and advanced <b>Java</b>! from Tutorialspoint</p>"
>>> soup = BeautifulSoup(markup, "html.parser")
>>> first_b, second_b = soup.find_all('b')
>>> print(first_b == second_b)
True
>>> print(first_b.previous_element == second_b.previous_element)
False
ただし、2つの変数が同じオブジェクトを参照しているかどうかを確認するには、次を使用できます。
>>> print(first_b is second_b)
False
美しいスープオブジェクトをコピーする
タグまたはNavigableStringのコピーを作成するには、以下のようにcopy.copy()関数を使用します。
>>> import copy
>>> p_copy = copy.copy(soup.p)
>>> print(p_copy)
<p>Learn Python and <b>Java</b> and advanced <b>Java</b>! from Tutorialspoint</p>
>>>
2つのコピー(元のコピーとコピーされたコピー)には同じマークアップが含まれていますが、2つは同じオブジェクトを表していません-
>>> print(soup.p == p_copy)
True
>>>
>>> print(soup.p is p_copy)
False
>>>
唯一の本当の違いは、extract()が呼び出されたかのように、コピーが元のBeautifulSoupオブジェクトツリーから完全に切り離されていることです。
>>> print(p_copy.parent)
None
上記の動作は、同じスペースを同時に占有できない2つの異なるタグオブジェクトが原因です。