6、BeautifulSoup- GETデータ

5、BeautifulSoup- GETデータ

クイック概要

from bs4 import BeautifulSoup

html = '''
<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 href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
and they lived at the bottom of a well.</p>
<p class="story">...</p>
'''
soup = BeautifulSoup(html,'lxml', from_encoding='utf-8')
print(soup.prettify())
print(soup.title)
print(soup.title.name)
print(soup.title.string)
print(soup.title.parent.name)
print(soup.p)
print(soup.p["class"])
print(soup.a)
print(soup.find_all('a'))
print(soup.find(id='link3'))

## 获取所有链接,文字内容
for link in soup.find_all('a'):
    print(link.get('href'))

print(soup.get_text())

## 通过文件创建
soup = BeautifulSoup(open('index.html'))
soup.prettify()

パーザー

美しいスープは、HTMLパーサのPythonの標準ライブラリ(Pythonの標準ライブラリパーサ)をサポートし、また、我々はそれをインストールしない場合は、サードパーティのパーサをサポートし、PythonはデフォルトのPythonパーサ、lxmlのより強力なパーサーを使用しますより速く、推奨インストール

lxmlのHTML構文解析lxmlのXMLパーサーhtml5lib

標的種

テキストから内部タグ。

基本的な使用

タグセレクタ

迅速な使用では、我々は次のコードを追加します。
印刷(soup.title)
タイプの(soup.title))印刷
印刷(soup.head)
印刷(soup.pを)

このスープで。タグ名、私たちは、タグの内容を取得することができ
、問題をここで一以上のそのようなラベル文書場合、返される結果は、最初のラベルの内容で、このようにラベルを取得し、ノートにあります上記のように、我々はsoup.p、およびファイルよりのpタグでpタグを取得しますが、唯一の最初のpタグの内容を返します。

の名前を取得します。

私たちはsoup.title.name時間でタイトルタグの名前を取得することができ、そのタイトル

プロパティを取得します

プリント(soup.p.attrs [ '名前'])
印刷(soup.p [ '名前'])
の二つの方法上記を取得することができるタグのname属性値p

コンテンツへのアクセス

印刷(soup.p.string)
第一のpラベルの内容を取得することができますが発生:
ヤマネの物語で、

入れ子の選択

我々はを通じて、以下の入れ子に取得する方法を指示することができます

印刷(soup.head.title.string)

子ノードとノードの子孫

使用の内容

html = """
<html>
    <head>
        <title>The Dormouse's story</title>
    </head>
    <body>
        <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">
                <span>Elsie</span>
            </a>
            <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a>
            and
            <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>
            and they lived at the bottom of a well.
        </p>
        <p class="story">...</p>
"""

from bs4 import BeautifulSoup

soup = BeautifulSoup(html,'lxml')
print(soup.p.contents)

## 将p标签下的所有子标签存入到了一个列表中

子供の使用

ラベルPの下でコンテンツ取得によって得られた内容と結果のすべての子ノードは同じですが、違いはsoup.p.childrenだけ循環の方法によって得ることができる情報として知られている反復オブジェクトではなく、リストを、あるあります

print(soup.p.children)
for i,child in enumerate(soup.p.children):
    print(i,child)

あなたが子孫によって子孫ノードを取得したい場合は、子供たちだけでなく、サブノードの内容を取得している
プリント(soup.descendants)が、このようなアクセスの結果はイテレータです

親と祖先ノード

あなたはsoup.a.parentによって親ノード情報を取得することができます

リスト祖先ノードが取得することができる(列挙(soup.a.parents))によって、この方法の結果は、情報のリストにもタグ、親の親のリストに親ノードのそれぞれに記憶されている、され、返さ文書全体の情報リストは、最後にリストに文書全体を話すだろう、リストの最後の要素だけでなく、すべての要素が格納されている最後から二番目

兄弟

背後soup.a.next_siblings兄弟ノードを取得
soup.a.previous_siblingsは、兄弟ノード、先行取得
取得に次の兄弟ラベルsoup.a.next_sibling
取得兄弟ラベルをsouo.a.previous_sinblingを

スタンダード・セレクタ

find_all

find_all(名前、attrsに、再帰的、テキスト、** kwargsからは)
名前タグ、属性、内容に基づいてドキュメントを見つけることができます

名前の使用

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all('ul'))
print(type(soup.find_all('ul')[0]))

返される結果は、さまざまな方法のリストです。

すべての情報ラベル李を得られるように、結果のために再びfind_allすることができます

for ul in soup.find_all('ul'):
    print(ul.find_all('li'))

ATTRS

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1" name="elements">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(attrs={'id': 'list-1'}))
print(soup.find_all(attrs={'name': 'elements'}))

ATTRSは、ラベルへの道を見つけるために辞書を渡すことができますが、クラスはPythonで特殊な分野であるため、特別なクラスが、そこにある、あなたは、関連するクラスを検索したい場合はそう= {「クラス_」ATTRSを変更することができます:「要素」 }又はsoup.find_all( ''、{ "クラス":「エレメント})、特殊なタグ属性できない書き込みATTRS、ID例えば

テキスト

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.find_all(text='Foo'))

見つけます

(名、attrsに、再帰的、見つけるテキスト、** kwargsからの)
最初に返さ整合素子の結果を見つけます

いくつかの他の同様の用法:
find_parents()は、すべての祖先ノードを返し、find_parent()は、直接の親を返します。
find_next_siblings()最初の兄弟ノードの後に()戻りfind_next_sibling、背後にあるすべての兄弟を返します。
find_previous_siblings()最初の兄弟ノードの前に戻るには()をfind_previous_sibling、以前のすべての兄弟を返します。
find_all_next())(find_next、すべての資格のあるノードの後のノードを返し、最初に一致したノードを返し
、すべての資格のあるノードがfind_previousノードを、(リターン後)(find_all_previous)は、最初に一致したノードを返します

CSSセレクタ

通过select()直接传入CSS选择器就可以完成选择
熟悉前端的人对CSS可能更加了解,其实用法也是一样的
.表示class #表示id
标签1,标签2 找到所有的标签1和标签2
标签1 标签2 找到标签1内部的所有的标签2
[attr] 可以通过这种方法找到具有某个属性的所有标签
[atrr=value] 例子[target=_blank]表示查找所有target=_blank的标签
-------------------------------------------------------------------
html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
print(soup.select('.panel .panel-heading'))
print(soup.select('ul li'))
print(soup.select('#list-2 .element'))
print(type(soup.select('ul')[0]))

コンテンツへのアクセス

)(GET_TEXTことによって、あなたはテキストの内容を取得することができます

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for li in soup.select('li'):
    print(li.get_text())

プロパティを取得します

または性質がかもしれ[属性名]またはATTRS [属性名]

html='''
<div class="panel">
    <div class="panel-heading">
        <h4>Hello</h4>
    </div>
    <div class="panel-body">
        <ul class="list" id="list-1">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
            <li class="element">Jay</li>
        </ul>
        <ul class="list list-small" id="list-2">
            <li class="element">Foo</li>
            <li class="element">Bar</li>
        </ul>
    </div>
</div>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'lxml')
for ul in soup.select('ul'):
    print(ul['id'])
    print(ul.attrs['id'])

概要:
推奨lxmlのパースライブラリー、必要に応じて、使用html.parserの
ラベルは、フィルタ機能を選択し、弱いですが、高速
(使用見つけることが推奨されます)、find_all()クエリは、単一の結果または複数の結果と一致した
CSSセレクタに慣れが(選択の使用を推奨している場合)
テキスト属性と値を取得するために一般的に使用される方法を覚えておいてください





('101.4.136.34:8168', 'http')
('183.146.213.157:8829', 'http')
('39.137.69.7:8331', 'http')
('39.137.69.9:8591', 'http')
('39.137.107.98:8700', 'http')
('223.199.25.238:8810', 'https')
('39.137.69.8:8973', 'http')
('118.187.58.34:8136', 'http')
('223.199.18.219:8122', 'https')
('223.199.16.73:8795', 'https')
('163.204.241.164:8300', 'http')
('111.79.45.61:8501', 'https')
('210.26.49.88:8720', 'https')
('116.21.123.158:8764', 'https')
('223.199.22.249:8162', 'http')
('218.60.8.83:8935', 'https')
('115.171.85.30:8581', 'http')
('119.23.79.199:8652', 'http')
('49.85.179.5:8574', 'http')
('60.167.22.214:8423', 'https')

おすすめ

転載: www.cnblogs.com/g2thend/p/12452204.html