BeautifulSoupは、PythonがHTMLを解析するための非常に便利なサードパーティライブラリです。
記事のディレクトリ
インストール
pip install beautifulsoup4
インポート
from bs4 import BeautifulSoup
ライブラリの解析
BeautifulSoupは、デフォルトでPythonの標準HTML解析ライブラリをサポートしていますが、いくつかのサードパーティの解析ライブラリもサポートしています。
スキル
そのようなウェブページhtmlがあります:
<!DOCTYPE html>
<!--STATUS OK-->
<html>
<head>
<meta content="text/html;charset=utf-8" http-equiv="content-type"/>
<meta content="IE=Edge" http-equiv="X-UA-Compatible"/>
<meta content="always" name="referrer"/>
<link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="stylesheet" type="text/css"/>
<title>
百度一下,你就知道 </title>
</head>
<body link="#0000cc">
<div id="wrapper">
<div id="head">
<div class="head_wrapper">
<div id="u1">
<a class="mnav" href="http://news.baidu.com" name="tj_trnews">
新闻 </a>
<a class="mnav" href="https://www.hao123.com" name="tj_trhao123">
hao123 </a>
<a class="mnav" href="http://map.baidu.com" name="tj_trmap">
地图 </a>
<a class="mnav" href="http://v.baidu.com" name="tj_trvideo">
视频 </a>
<a class="mnav" href="http://tieba.baidu.com" name="tj_trtieba">
贴吧 </a>
<a class="bri" href="//www.baidu.com/more/" name="tj_briicon" style="display: block;">
更多产品 </a>
</div>
</div>
</div>
</div>
</body>
</html>
# 创建beautifulsoup4对象
from bs4 import BeautifulSoup
bs = BeautifulSoup(html,"html.parser")
# 缩进格式
print(bs.prettify())
# 获取title标签的所有内容
print(bs.title)
# 获取title标签的名称
print(bs.title.name)
# 获取title标签的文本内容
print(bs.title.string)
# 获取head标签的所有内容
print(bs.head)
# 获取第一个div标签中的所有内容
print(bs.div)
# 获取第一个div标签的id的值
print(bs.div["id"])
# 获取第一个a标签中的所有内容
print(bs.a)
# 获取所有的a标签中的所有内容
print(bs.find_all("a"))
# 获取id="u1"
print(bs.find(id="u1"))
# 获取所有的a标签,并遍历打印a标签中的href的值
for item in bs.find_all("a"):
print(item.get("href"))
# 获取所有的a标签,并遍历打印a标签的文本值
for item in bs.find_all("a"):
print(item.get_text()) // 等同于print(item.string)
BeautifulSoup44種類のオブジェクト
BeautifulSoup4は、複雑なHTMLドキュメントを複雑なツリー構造に変換します。各ノードはPythonオブジェクトです。すべてのオブジェクトは、次の4つのタイプに要約できます。
タグ、NavigableString、BeautifulSoup、コメント
Tag:Tagは、素人の用語では、HTMLのタグです。
from bs4 import BeautifulSoup
bs = BeautifulSoup(html,"html.parser")
# 获取title标签的所有内容
print(bs.title)
# 获取head标签的所有内容
print(bs.head)
# 获取第一个a标签的所有内容
print(bs.a)
# 类型
print(type(bs.a))
スープにタグ名を追加することで、これらのタグの内容を簡単に取得できます。これらのオブジェクトのタイプはbs4.element.Tagです。
ただし、すべてのコンテンツの要件を満たす最初のラベルを探すことに注意してください。
タグの場合、名前と属性という2つの重要な属性があります。
# [document]
#bs 对象本身比较特殊,它的 name 即为 [document]
print(bs.name)
# head
#对于其他内部标签,输出的值便为标签本身的名称
print(bs.head.name)
# 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。
print(bs.a.attrs) # 常用
#还可以利用get方法,传入属性的名称,二者是等价的
print(bs.a['class']) # bs.a.get('class')
# 可以对这些属性和内容等等进行修改
bs.a['class'] = "newClass"
print(bs.a)
# 还可以对这个属性进行删除
del bs.a['class']
print(bs.a)
NavigableString:.stringを使用してラベル内のテキストを取得します (一般的に使用されます)
print(bs.title.string)
print(type(bs.title.string))
BeautifulSoup:ドキュメントのコンテンツを表します
ほとんどの場合、これは特別なタグであるTagオブジェクトと見なすことができます。そのタイプ、名前、および属性は、次のように個別に取得できます。
print(type(bs.name))
print(bs.name)
print(bs.attrs)
コメント:NavigableStringオブジェクトの特殊なタイプであり、その出力にはコメント記号が含まれていません
print(bs.a) # 此时不能出现空格和换行符,a标签如下:
# <a class="mnav" href="http://news.baidu.com" name="tj_trnews"><!--新闻--></a>
print(bs.a.string) # 新闻
print(type(bs.a.string)) # <class 'bs4.element.Comment'>
ドキュメントツリーをトラバースする
.contents:Tagのすべての子ノードを取得し、リストを返します
# tag的.content 属性可以将tag的子节点以列表的方式输出
print(bs.head.contents)
# 用列表索引来获取它的某一个元素
print(bs.head.contents[1])
.children:Tagのすべての子ノードを取得し、ジェネレーターを返します
for child in bs.body.children:
print(child)
ドキュメントツリーを検索する
find_all(name、attrs、recursive、text、** kwargs)
名前パラメーター:
文字列フィルタリング:文字列に完全に一致するコンテンツを検索し、ラベルを返します
a_list = bs.find_all("a")
print(a_list)
正規表現のフィルタリング:正規表現が渡されると、BeautifulSoup4はsearch()を介してコンテンツと一致します
t_list = bs.find_all(re.compile("a"))
for item in t_list:
print(item)
リスト:リストを渡すと、BeautifulSoup4はリスト内の任意の要素に一致するノードを返します
t_list = bs.find_all(["meta","link"])
for item in t_list:
print(item)
メソッド:メソッドを渡し、メソッドに従って照合します
def name_is_exists(tag):
return tag.has_attr("name")
t_list = bs.find_all(name_is_exists)
for item in t_list:
print(item)
kwargsパラメーター
# 查询id=head的Tag
t_list = bs.find_all(id="head")
print(t_list)
# 查询href属性包含ss1.bdstatic.com的Tag
t_list = bs.find_all(href=re.compile("http://news.baidu.com"))
print(t_list)
# 查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
t_list = bs.find_all(class_=True)
for item in t_list:
print(item)
attrsパラメーター
HTMLデータ-*属性など、すべての属性をこの方法で検索できるわけではありません。attrsパラメーターを使用して辞書を定義し、特別な属性を含むタグを検索できます。
t_list = bs.find_all(attrs={
"data-foo":"value"})
for item in t_list:
print(item)
テキストパラメータ
textパラメータを使用して、ドキュメント内の文字列の内容を検索できます。これは、nameパラメータのオプションの値と同じです。
textパラメータは、文字列、正規表現、およびリストを受け入れます
t_list = bs.find_all(attrs={
"data-foo": "value"})
for item in t_list:
print(item)
t_list = bs.find_all(text="hao123")
for item in t_list:
print(item)
t_list = bs.find_all(text=["hao123", "地图", "贴吧"])
for item in t_list:
print(item)
t_list = bs.find_all(text=re.compile("\d"))
for item in t_list:
print(item)
制限パラメータ
返品の数を制限するには、limitパラメーターを渡します。
たとえば、次の置換の数は2です。
t_list = bs.find_all("a",limit=2)
for item in t_list:
print(item)
find()
条件を満たす最初のタグ
を返します。つまり、値を取得する場合は、このメソッドを使用できます。
t = bs.div.div
# 等价于
t = bs.find("div").find("div")
CSSセレクター
## 通过标签名查找
print(bs.select('title'))
print(bs.select('a'))
# 通过类名查找
print(bs.select('.mnav'))
# 通过id查找
print(bs.select('#u1'))
# 组合查找
print(bs.select('div .bri'))
# 属性查找
print(bs.select('a[class="bri"]'))
print(bs.select('a[href="http://tieba.baidu.com"]'))
# 获取内容
t_list = bs.select("title")
print(bs.select('title')[0].get_text())