【パイソン】BeautifulSoup

前書き

WebページはHTMLドキュメントで構成されていることがわかっています。HTMLドキュメントは特定のルールを備えた構造化ドキュメントであり、その構造により情報の抽出が簡単になります。

Beautiful Soup 4.4.0ドキュメント

私の理解はこれです:HTMLドキュメントのセクションを介してBeautifulSoup()构造方法、オブジェクトに解析されたオブジェクトを操作します。

Beautiful Soupは、HTMLまたはXMLファイルからデータを抽出できるPythonライブラリです。名前は「不思議の国のアリス」に由来し、以下のコードは公式ドキュメントに由来し、「不思議の国のアリス」のセクションです

ここに画像の説明を挿入
BeautifulSoupを使用してこのコードを解析すると、標準のインデント形式の構造に従って出力できるBeautifulSoupオブジェクトを取得できます。

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc, 'html.parser')

print(soup.prettify())

# 输出
# <html>
#  <head>
#   <title>
#    The Dormouse's story
#   </title>
#  </head>
#  <body>
#   <p class="title">
#    <b>
#     The Dormouse's story
#    </b>
#   </p>
#   <p class="story">
#    Once upon a time there were three little sisters; and their names were
#    <a class="sister" href="http://example.com/elsie" id="link1">
#     Elsie
#    </a>
#    ,
#    <a class="sister" href="http://example.com/lacie" id="link2">
#     Lacie
#    </a>
#    and
#    <a class="sister" href="http://example.com/tillie" id="link2">
#     Tillie
#    </a>
#    ; and they lived at the bottom of a well.
#   </p>
#   <p class="story">
#    ...
#   </p>
#  </body>
# </html>

構造化データを閲覧するいくつかの簡単な方法:
soup.title
# <title>The Dormouse's story</title>

soup.title.name
# u'title'

soup.title.string
# u'The Dormouse's story'

soup.title.parent.name
# u'head'

soup.p
# <p class="title"><b>The Dormouse's story</b></p>

soup.p['class']
# u'title'

soup.a
# <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>

soup.find_all('a')
# [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,
#  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,
#  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]

soup.find(id="link3")
# <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>

ドキュメントから `<a>`タグのすべてのリンクを見つけます:

ここに画像の説明を挿入

ドキュメントからすべてのテキストコンテンツを取得します。
ここに画像の説明を挿入


パーサー

Beautiful Soupは実際には解析時にパーサーに依存しています。Python標準ライブラリでHTMLパーサーをサポートするだけでなく、サードパーティのパーサー(lxmlなど)もサポートしています。

パーサー 指示
Python標準ライブラリ BeautifulSoup(マークアップ、「html.parser」)
xml HTMLパーサー BeautifulSoup(マークアップ、「lxml」)
lxml XMLパーサー BeautifulSoup(マークアップ、「xml」)
html5lib BeautifulSoup(マークアップ、「html5lib」)

オブジェクト

Beautiful Soupは複雑なHTMLドキュメントを複雑なツリー構造に変換します。各ノードはPythonオブジェクトであり、すべてのオブジェクトは4つのタイプに要約できます。

  • 鬼ごっこ
  • NavigableString
  • BeautifulSoup
  • コメント

鬼ごっこ

Tag中には、HTMLラベルの意味である
ここに画像の説明を挿入
出力:
ここに画像の説明を挿入

タグの最も重要な属性:

  • 名前
  • 属性

名前

各タグには独自の名前があり、.nameを通じて取得できます。

タグ名を変更すると、現在のBeautiful Soupオブジェクトによって生成されたすべてのHTMLドキュメントに影響します。
ここに画像の説明を挿入

の属性

タグには多くの属性がある場合があります。タグには、値が「boldest」の「class」属性があります。タグ属性の操作方法は、辞書と同じです。

直接「クリック」して属性を取得することもできます。例:.attrs:

ここに画像の説明を挿入


タグの属性は追加、削除、変更が可能で、タグの属性の操作方法は辞書と同じです
ここに画像の説明を挿入

NavigableString

トラバース可能な文字列
はタグに含まれることがよくあります。BeautifulSoupNavigableStringクラスを使用して
ここに画像の説明を挿入


タグ内の文字列をラップします。タグに含まれる文字列は編集できませんが、他の文字列に置き換えることができます。replace_with()を使用してください。方法:
ここに画像の説明を挿入

BeautifulSoup

BeautifulSoupオブジェクトは、ドキュメントのコンテンツ全体を表します。ほとんどの場合、これはTagオブジェクトと見なすことができ、ドキュメントツリーのトラバースとドキュメントツリーの検索で説明されているほとんどのメソッドをサポートしています。

BeautifulSoupオブジェクトは実際のHTMLまたはXMLタグではないため、名前と属性の属性はありませんが、.name属性を表示すると便利な場合があるため、BeautifulSoupオブジェクトには値が含まれています
ここに画像の説明を挿入


コメント

ドキュメントのコメント部分を処理する
ここに画像の説明を挿入



ドキュメントツリーをトラバースする

次の例を使用して、ドキュメントの一部から別のコンテンツを検索する方法を示します。
ここに画像の説明を挿入
タグには、複数の文字列または他のタグが含まれる場合があります。これらは、このタグの子ノードです。ビューティフルスープは、多くの操作と子ノードのトラバースを提供します。属性。


タグ名

直接soup.tag的名字ドキュメントツリーの操作を通じてあなたが取得したい場合<head>限り、ラベルをSoup.head
ここに画像の説明を挿入
あなたはドキュメントツリーのタグにこのメソッドを複数回呼び出すことができます。
soup.tag名字.tag名字.····

属性をクリックすると、現在の名前の最初のタグのみを取得できます

すべての<a>タグを取得する場合、またはタグ名を使用して、ツリーの検索で説明されている方法を使用する必要がある場合よりも多くのコンテンツを取得する場合は、次のようになります。find_all()
ここに画像の説明を挿入

.contentsと.children

タグの.contents属性は、タグの子ノードをリストとして出力できます。
ここに画像の説明を挿入

タグの.childrenジェネレーターを使用して、タグの子ノードをループできます。
ここに画像の説明を挿入

。子孫

.descendants属性は、タグのすべての子孫を再帰的にループできます。
ここに画像の説明を挿入

。ストリング

タグにタイプNavigableStringの子ノードが1つしかない場合、またはタグに子ノードが1つしかない場合、このタグを使用して子ノードを取得できます。
ここに画像の説明を挿入
タグに複数の子ノードが含まれている場合、タグを特定できず.string、出力結果はNone

.stringsとstripped_strings

タグに複数の文字
ここに画像の説明を挿入
列が含まれている場合は、.stringsを使用して循環的に取得できます。出力文字列に多くのスペースまたは空白行が含まれる場合があり、.stripped_stringsを使用して余分な空白コンテンツを削除します。
すべてのスペースを含む行は無視され、段落の最初と最後のスペースは削除されます。

。親

.parentプロパティを介して要素の親ノードを取得します。例「Alice」のドキュメントでは、ラベルは标签的父节点.<br/> <img src="https://img-blog.csdnimg.cn/20200910145334723.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTQ2ODg0NQ==,size_16,color_FFFFFF,t_70#pic_center" alt="在这里插入图片描述"/><br/> <br/>

。親

要素の.parentsプロパティを通じて、要素のすべての親ノードを再帰的に取得できます。次の例では、.parentsメソッドを使用して、ラベルからルートノードまですべてのノードをトラバースします。
ここに画像の説明を挿入

.next_sibling和.previous_sibling

ドキュメントツリーで、.next_siblingおよび.previous_sibling属性を使用して兄弟ノードをクエリします。


.next_siblings和.previous_siblings

.next_siblingsプロパティと.previous_siblingsプロパティを使用して、現在のノードの兄弟ノードを繰り返し出力できます。



ドキュメントツリーを検索


find_all

最初に一致したオブジェクトのみを返します
構文:

find_all( name , attrs , recursive , string , **kwargs )
  • nameは、nameがnameであるすべてのタグを検索し、文字列オブジェクトは自動的に無視されます。
  • キーワード検索では、このパラメーターを、指定された名前タグの属性として使用して検索します。
    ここに画像の説明を挿入

見つける

一致するすべての結果を返します。これは、find(findは最初に見つかった結果のみを返す)
構文とは異なります。

find( name , attrs , recursive , string , **kwargs )  

find_parents()和find_parent()

find_parents( name , attrs , recursive , string , **kwargs )

find_parent( name , attrs , recursive , string , **kwargs )


ドキュメントツリーを変更する

タグ名と属性を変更する

ここに画像の説明を挿入

.stringを変更する

タグの.string属性に値を割り当てることは、元のコンテンツを現在のコンテンツで置き換えることと同じです。
ここに画像の説明を挿入
注:現在のタグに他のタグが含まれている場合、.string属性に値を割り当てると、subを含むすべての元のコンテンツが上書きされます鬼ごっこ


new_tag()

タグを作成する最良の方法は、ファクトリメソッドBeautifulSoup.new_tag()を呼び出すことです。

ここに画像の説明を挿入
最初のパラメーターはタグの名前で、必須です。他のパラメーターはオプションです。


append()

Pythonリストの.append()メソッドと同様に、Tag.append()メソッドはタグにコンテンツを追加します。
ここに画像の説明を挿入

インサート()

Tag.insert()メソッドはTag.append()メソッドに似ています。違いは、新しい要素は親ノードに追加されないことです。コンテンツ属性は最後にありますが、要素は指定された位置に挿入されます。Pythonのlist.insert(と同じです。 )メソッドの使用法は以下と同じです。

ここに画像の説明を挿入

insert_before()とinsert_after()

insert_before()メソッドは、現在のタグまたはテキストノードの前にコンテンツを挿入します。insert_after()メソッドは、現在のタグまたはテキストノードの
後にコンテンツを挿入します。
ここに画像の説明を挿入

その他の機能

晴れ() 現在のタグのコンテンツを削除します。
エキス() ドキュメントツリーから現在のタグを削除し、メソッドの結果として返します。
decompose() ドキュメントツリーから現在のノードを削除し、完全に破棄します。
と置換する() ドキュメントツリーのコンテンツを削除し、新しいタグまたはテキストノードに置き換えます。
ラップ() 指定されたタグ要素[8]をラップして、ラップされた結果を返すことができます
unwrap() wrap()メソッドとは異なり、タグ内のすべてのタグタグが削除されます。このメソッドは、タグを解凍するためによく使用されます。

出力

フォーマットされた出力

prettify()このメソッドは、Beautiful Soupのドキュメントツリーをフォーマットし、Unicodeエンコーディングで出力します。各XML / HTMLタグにはここに画像の説明を挿入
独自のがあります。BeautifulSoupオブジェクトとそのタグノードは、prettify()メソッドを呼び出すことができます。
ここに画像の説明を挿入

圧縮出力

フォーマットに注意せずに結果の文字列を取得したい場合は、PythonをBeautifulSoup Tagオブジェクトまたはオブジェクトunicode()またはstr()メソッドに使用できます
ここに画像の説明を挿入

get_text()

タグにテキストが含まれてget_text()いる場合、このメソッドを使用できます。このメソッドは、コンテンツのタグの子孫を含むすべてのテキストバージョンにコンテンツが含まれており、結果がUnicode文字列として返されます。

タグのテキストコンテンツの区切り文字は、パラメーターで指定できます。

取得したテキストコンテンツの前後の空白を削除することもできます。
ここに画像の説明を挿入

Beautiful Soupオブジェクトをコピーする

copy.copy()メソッドは、任意のTagまたはNavigableStringオブジェクトをコピーできます

import copy
p_copy = copy.copy(soup.p)
print p_copy
# <p>I want <b>pizza</b> and more <b>pizza</b>!</p>

コピーされたオブジェクトはオブジェクトと同じですが、別のメモリアドレスを指しています

print soup.p == p_copy
# True

print soup.p is p_copy
# False

おすすめ

転載: blog.csdn.net/weixin_45468845/article/details/108498707