ネット爬虫類ノート(Day 8)——BeautifulSoup


BeautifulSoup
私たちはウェブサイトに行ってデータを抽出して、どのようなデータが私たちが抽出したいのか、どのようなデータがウェブページに変化しないのかを知る必要があります.
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']

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})