前書き
WebページはHTMLドキュメントで構成されていることがわかっています。HTMLドキュメントは特定のルールを備えた構造化ドキュメントであり、その構造により情報の抽出が簡単になります。
私の理解はこれです: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
トラバース可能な文字列
はタグに含まれることがよくあります。BeautifulSoupはNavigableStringクラスを使用して
タグ内の文字列をラップします。タグに含まれる文字列は編集できませんが、他の文字列に置き換えることができます。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」のドキュメントでは、ラベルは
。親
要素の.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