ネット爬虫類ノート(Day 8)——BeautifulSoup
11211 ワード
BeautifulSoup
私たちはウェブサイトに行ってデータを抽出して、どのようなデータが私たちが抽出したいのか、どのようなデータがウェブページに変化しないのかを知る必要があります.
Beautiful Soupは、ナビゲーション、検索、分析ツリーの変更などの機能を処理するための簡単なpython式の関数を提供します.ドキュメントを解析してユーザーにキャプチャする必要があるデータを提供するツールボックスです.簡単なので、コードをあまり必要とせずに完全なアプリケーションを書くことができます.Beautiful Soupは入力ドキュメントを自動的にUnicode符号化に変換し、出力ドキュメントをutf-8符号化に変換します.ドキュメントに符号化方法が指定されていない限り、符号化方法を考慮する必要はありません.この場合、Beautiful Soupは符号化方法を自動的に認識できません.そして、元の符号化方法を説明するだけでいいです.
3種類:bs 4.BeautifulSoup, bs4.element.Tag, NavigableString
インストール
bs4.BeautifulSoup(美味しいスープ)
bs4.BeautifulSoupは、Tagから継承されます.すなわち,Tagにおける関数,変数の多くはbs 4である.BeautifulSoupで使用します.
element.Tag(ラベル)
name,attributes(名前と属性)
TagのメソッドをBeautifulSoupのクラスに同じように配置し、どのような状況を試してみますか.
Multi-valued attributes(多値属性)
Going down(ドキュメント内のラベルを検索)
using tag name(ラベル名で取得)
using .contents and .children
contentsはlist childrenがlist_を返しますiterator
Filters
a string, a regular expression, a list, a function, or the value True.
Definitions:
name
tag name:
keyword arguments
kwargs
special
string
limit
recursive
Calling a tag like a function
find
css selector
Tags find
class
attribute
注意事項
フォーマットコーディングの問題
あるulの下に複数のliがあり、半分はスタイルがあり、半分はありませんが、ちょうど彼らは2つのカテゴリで、あなたもちょうどこの2つが必要です.例えば:
私たちはウェブサイトに行ってデータを抽出して、どのようなデータが私たちが抽出したいのか、どのようなデータがウェブページに変化しないのかを知る必要があります.
Beautiful Soupは、ナビゲーション、検索、分析ツリーの変更などの機能を処理するための簡単なpython式の関数を提供します.ドキュメントを解析してユーザーにキャプチャする必要があるデータを提供するツールボックスです.簡単なので、コードをあまり必要とせずに完全なアプリケーションを書くことができます.Beautiful Soupは入力ドキュメントを自動的にUnicode符号化に変換し、出力ドキュメントをutf-8符号化に変換します.ドキュメントに符号化方法が指定されていない限り、符号化方法を考慮する必要はありません.この場合、Beautiful Soupは符号化方法を自動的に認識できません.そして、元の符号化方法を説明するだけでいいです.
3種類:bs 4.BeautifulSoup, bs4.element.Tag, NavigableString
インストール
pip install bs4
bs4.BeautifulSoup(美味しいスープ)
bs4.BeautifulSoupは、Tagから継承されます.すなわち,Tagにおける関数,変数の多くはbs 4である.BeautifulSoupで使用します.
html_str = """
<html><head><title>The Dormouse's storytitle>head>
<body>
<p class="title"><b>The Dormouse's storyb>p>
<p class="story">Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">Elsiea>,
<a href="http://example.com/lacie" class="sister" id="link2">Laciea> and
<a href="http://example.com/tillie" class="sister" id="link3">Tilliea>;
and they lived at the bottom of a well.p>
<p class="story">...p>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc)
type(soup)
element.Tag(ラベル)
name,attributes(名前と属性)
TagのメソッドをBeautifulSoupのクラスに同じように配置し、どのような状況を試してみますか.
#
p = soup.p
#
type(p)
#
p.name
#
p.attrs
#
p['class']
#
p['id'] = 1
Multi-valued attributes(多値属性)
css_soup = BeautifulSoup('')
css_soup.p['class']
css_soup = BeautifulSoup('
')
css_soup.p['class']
id_soup = BeautifulSoup('
')
id_soup.p['id']
NavigableString (一种类似string的类型)
p.string
type(p.string)
p.string.parent
str(p.string)
type(str(p.string))
Going down(ドキュメント内のラベルを検索)
using tag name(ラベル名で取得)
soup.head
soup.title
soup.body.b
using .contents and .children
contentsはlist childrenがlist_を返しますiterator
soup.body.contents
soup.body.children
for child in soup.body:
print(child)
Filters
a string, a regular expression, a list, a function, or the value True.
soup.find_all('b')
import re
for tag in soup.find_all(re.compile("^b")):
print(tag.name)
for tag in soup.find_all(re.compile("t")):
print(tag.name)
Definitions:
find_all(name, attrs, recursive, string, limit, **kwargs)
name
tag name:
soup.find_all("title")
keyword arguments
kwargs
soup.find_all(id='link2')
soup.find_all(href=re.compile("elsie"), id='link1')
soup.find_all(id=True)
soup.find_all(href=re.compile("elsie"))
data_soup = BeautifulSoup('foo!')
data_soup.find_all(data-foo="value")
data_soup.find_all(attrs={"data-foo": "value"})
special
soup.find_all("a", class_="sister")
soup.find_all("a", attrs={"class": "sister"})
string
soup.find_all(string="Elsie")
soup.find_all(string=["Tillie", "Elsie", "Lacie"])
soup.find_all(string=re.compile("Dormouse"))
def is_the_only_string_within_a_tag(s):
return (s == s.parent.string)
soup.find_all(string=is_the_only_string_within_a_tag)
soup.find_all("a", string="Elsie")
limit
soup.find_all("a", limit=2)
recursive
soup.html.find_all("title")
soup.html.find_all("title", recursive=False)
Calling a tag like a function
soup.find_all("a")
soup("a")
soup.title.find_all(string=True)
soup.title(string=True)
find
soup.find_all('title', limit=1)
# [The Dormouse's story ]
soup.find('title')
# The Dormouse's story
css selector
Tags find
soup.select("title")
soup.select("p:nth-of-type(3)")
class
soup.select(".sister")
attribute
soup.select('a[href]')
soup.select('a[href="http://example.com/elsie"]')
soup.select('a[href^="http://example.com/"]')
soup.select('a[href$="tillie"]')
soup.select('a[href*=".com/el"]')
注意事項
フォーマットコーディングの問題
BeautifulSoup(page, from_encoding='gb2312')
あるulの下に複数のliがあり、半分はスタイルがあり、半分はありませんが、ちょうど彼らは2つのカテゴリで、あなたもちょうどこの2つが必要です.例えば:
html = '''
- hello world!
- hello world!
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html,'lxml')
no_tag = soup.find('li',{'class':False})