diff options
Diffstat (limited to 'doc.jp/index.html')
-rw-r--r-- | doc.jp/index.html | 2822 |
1 files changed, 2822 insertions, 0 deletions
diff --git a/doc.jp/index.html b/doc.jp/index.html new file mode 100644 index 0000000..7f5d8e6 --- /dev/null +++ b/doc.jp/index.html @@ -0,0 +1,2822 @@ +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> + + +<html xmlns="http://www.w3.org/1999/xhtml"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> + + <title>kondou.com - Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)</title> + + <link rel="stylesheet" href="_static/default.css" type="text/css" /> + <link rel="stylesheet" href="_static/pygments.css" type="text/css" /> + + <script type="text/javascript"> + var DOCUMENTATION_OPTIONS = { + URL_ROOT: './', + VERSION: '4.2.0', + COLLAPSE_INDEX: false, + FILE_SUFFIX: '.html', + HAS_SOURCE: true + }; + </script> + <script type="text/javascript" src="_static/jquery.js"></script> + <script type="text/javascript" src="_static/underscore.js"></script> + <script type="text/javascript" src="_static/doctools.js"></script> + <link rel="top" title="Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)" href="#" /> + </head> + <body> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + accesskey="I">index</a></li> + <li><a href="#">Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)</a> »</li> + </ul> + </div> + + <div class="document"> + <div class="documentwrapper"> + <div class="bodywrapper"> + <div class="body"> + + <div class="section" id="beautiful-soup"> +<h1>Beautiful Soup<a class="headerlink" href="#beautiful-soup" title="Permalink to this headline">¶</a></h1> +<img alt=""The Fish-Footman began by producing from under his arm a great letter, nearly as large as himself."" class="align-right" src="6.1.jpg" /> +<p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/">Beautiful Soup</a> はHTMLやXMLファイルからデータを取得するPythonのライブラリです。あなたの好きなパーサー(構文解析器)を使って、パースツリー(構文木)の探索、検索、修正を行います。 +これはプログラマーの作業時間を大幅に短縮してくれます。</p> +<div class="section" id="id2"> +<h2>(訳注)石鹸は食べられない<a class="headerlink" href="#id2" title="Permalink to this headline">¶</a></h2> +<p>この文書は <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs4/doc/">Beautiful Soup 4.2.0 Documentation</a> の日本語訳です。”Beautiful Soup”を”ビューティフルソープ”と読んでしまう英語が苦手でちょっぴりHな後輩のために翻訳しました。</p> +<p>2013年10月29日からこの文書の翻訳をはじめました。11月1日現在まだ全てを訳し終えていませんが、スクレイピングに使う主な部分はとりあえず訳したので、一旦これで公開して、あとは年内を目処にまったりと翻訳をすすめ、あわせて質を高めていこうと思っています。今のところ、<a class="reference internal" href="#id38">パースツリーを修正</a> 以降は、ざっくり訳のためにおかしな表現が多々あることにご注意ください。</p> +<p>誤訳やわかりづらいところを見つけたり、なにかご意見があるときには、近藤茂徳(<img src="sgm.png"/>)までご連絡ください。こういった翻訳をするのははじめてなので、つっこみ大歓迎です。よろしくお願いします。</p> +<p>2013年10月現在、Beautiful Soupについての日本語Webページは、Beautiful Soup 3とBeautiful Soup 4(以下、BS3,BS4)の情報が混在しています。とくに、”Beautiful Soup”で日本語ページを対象にググると、最初に表示される10件中9件がBS3による情報であるために、初心者はそのままBS3を使って混乱しがちです。ご注意ください。</p> +<p><strong>混乱しないように初心者が知っておくべきこと</strong></p> +<ul class="simple"> +<li>2012年5月にBS3の開発が終了し、現在ではBS4の利用が推奨されています</li> +<li>BS3はPython3に対応していません</li> +<li>ただし、BS3のスクリプトのほとんどはimport文を変えるだけでBS4でも動きます</li> +<li>そのため、BS3による情報も問題解決の役に立ちます</li> +<li>詳しくは <a class="reference internal" href="#beautiful-soup-3">Beautiful Soup 3</a> を読んでください</li> +<li>この文書の <a class="reference internal" href="#id7">クイックスタート</a> と <a class="reference internal" href="#find-all">find_all()</a> を読めば、それなりに用は足りると思います</li> +</ul> +</div> +<div class="section" id="id3"> +<h2>この文書について<a class="headerlink" href="#id3" title="Permalink to this headline">¶</a></h2> +<p>この文書は、Beautiful Soup 4 (訳注:以下BS4)の主要機能について、例を挙げて説明します。どのライブラリがよいか、どのように動くか、どのように使うか、どのようにあなたの望むことを達成するか、予想外の動きをしたときは何をすればよいかといったことを示します。</p> +<p>この文書で挙げられる例は、Python2.7と3.2のどちらでも同じように動きます。</p> +<p>あなたは <a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup 3 (訳注:以下BS3)の文書</a> を探しているのかもしれません。もしそうなら、BS3はすでに開発を終えていて、BS4が全てのプロジェクト対して推奨されていることを知っていてください。BS3とBS4の違いを知りたいときは、<a class="reference internal" href="#bs4">BS4への移行</a> を見てください。</p> +<p>この文書は、ユーザーにより他の言語にも翻訳されています。</p> +<ul class="simple"> +<li>이 문서는 한국어 번역도 가능합니다.(<a class="reference external" href="http://coreapython.hosting.paran.com/etc/beautifulsoup4.html">외부 링크</a>)</li> +</ul> +</div> +<div class="section" id="id5"> +<h2>助けてほしいときは<a class="headerlink" href="#id5" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soup について疑問が生じたり、問題に直面したときは、 <a class="reference external" href="https://groups.google.com/forum/?fromgroups#!forum/beautifulsoup">ディスカッショングループにメールしてください。</a> もし問題がHTMLのパースのことであれば、そのHTMLについて <a class="reference internal" href="#diagnose"><em>diagnose() 関数の返す内容</em></a> を必ず書くようにしてください。</p> +</div> +</div> +<div class="section" id="id7"> +<h1>クイックスタート<a class="headerlink" href="#id7" title="Permalink to this headline">¶</a></h1> +<p>以下のHTMLドキュメントは、このあと何回も例として用いられます。 <strong>ふしぎの国のアリス</strong> からの引用です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">"""</span> +<span class="s"><html><head><title>The Dormouse's story</title></head></span> +<span class="s"><body></span> +<span class="s"><p class="title"><b>The Dormouse's story</b></p></span> + +<span class="s"><p class="story">Once upon a time there were three little sisters; and their names were</span> +<span class="s"><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,</span> +<span class="s"><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and</span> +<span class="s"><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;</span> +<span class="s">and they lived at the bottom of a well.</p></span> + +<span class="s"><p class="story">...</p></span> +<span class="s">"""</span> +</pre></div> +</div> +<p>この”three sisters”ドキュメントを Beautiful Soup にかけると、 <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトが得られます。これは入れ子データ構造でドキュメントを表現します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span> + +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <html></span> +<span class="c"># <head></span> +<span class="c"># <title></span> +<span class="c"># The Dormouse's story</span> +<span class="c"># </title></span> +<span class="c"># </head></span> +<span class="c"># <body></span> +<span class="c"># <p class="title"></span> +<span class="c"># <b></span> +<span class="c"># The Dormouse's story</span> +<span class="c"># </b></span> +<span class="c"># </p></span> +<span class="c"># <p class="story"></span> +<span class="c"># Once upon a time there were three little sisters; and their names were</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1"></span> +<span class="c"># Elsie</span> +<span class="c"># </a></span> +<span class="c"># ,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2"></span> +<span class="c"># Lacie</span> +<span class="c"># </a></span> +<span class="c"># and</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link2"></span> +<span class="c"># Tillie</span> +<span class="c"># </a></span> +<span class="c"># ; and they lived at the bottom of a well.</span> +<span class="c"># </p></span> +<span class="c"># <p class="story"></span> +<span class="c"># ...</span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p>以下は、データ構造を探索するいくつかの方法です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">title</span> +<span class="c"># <title>The Dormouse's story</title></span> + +<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">name</span> +<span class="c"># u'title'</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">string</span> +<span class="c"># u'The Dormouse's story'</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">name</span> +<span class="c"># u'head'</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">p</span> +<span class="c"># <p class="title"><b>The Dormouse's story</b></p></span> + +<span class="n">soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="c"># u'title'</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'a'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">"link3"</span><span class="p">)</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a></span> +</pre></div> +</div> +<p>よくある処理として、ページの<a>タグ内にあるURLを全て抽出するというものがあります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">link</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'a'</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">link</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'href'</span><span class="p">))</span> +<span class="c"># http://example.com/elsie</span> +<span class="c"># http://example.com/lacie</span> +<span class="c"># http://example.com/tillie</span> +</pre></div> +</div> +<p>また、ページからタグを除去して全テキストを抽出するという処理もあります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">get_text</span><span class="p">())</span> +<span class="c"># The Dormouse's story</span> +<span class="c">#</span> +<span class="c"># The Dormouse's story</span> +<span class="c">#</span> +<span class="c"># Once upon a time there were three little sisters; and their names were</span> +<span class="c"># Elsie,</span> +<span class="c"># Lacie and</span> +<span class="c"># Tillie;</span> +<span class="c"># and they lived at the bottom of a well.</span> +<span class="c">#</span> +<span class="c"># ...</span> +</pre></div> +</div> +<p>必要な情報は得られましたか?つづきをどうぞ。</p> +</div> +<div class="section" id="id8"> +<h1>インストール<a class="headerlink" href="#id8" title="Permalink to this headline">¶</a></h1> +<p>DebianかUbuntuの最近のバージョンを使っていれば、Beautiful Soupはシステムのパッケージマネージャでインストールできます。:</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-bs4</span></tt></p> +<p>Beautiful Soup 4 は PyPiを通して公開されています。そのため、もしシステムパッケージで Beautiful Soup をインストールできないときは、<tt class="docutils literal"><span class="pre">easy_install</span></tt> か <tt class="docutils literal"><span class="pre">pip</span></tt> でインストールできます。</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">beautifulsoup4</span></tt></p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">beautifulsoup4</span></tt></p> +<p>( <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> パッケージはおそらくあなたが探しているものでは <strong>ありません</strong> 。これは、一つ前のメジャーリリース <a class="reference internal" href="#beautiful-soup-3">Beautiful Soup 3</a> です。多くのソフトウェアがBS3を使っていて、今でもBS3は利用できます。しかし、新しくコードを書く場合は、 <tt class="docutils literal"><span class="pre">beautifulsoup4</span></tt> をインストールすべきです。)</p> +<p>もし、 <tt class="docutils literal"><span class="pre">easy_install</span></tt> や <tt class="docutils literal"><span class="pre">pip</span></tt> をインストールしてないときは、<a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/download/4.x/">download the Beautiful Soup 4 source tarball</a> でソースをダウンロードし <tt class="docutils literal"><span class="pre">setup.py</span></tt> を用いてインストールできます。</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">python</span> <span class="pre">setup.py</span> <span class="pre">install</span></tt></p> +<p>もしどの方法も失敗するのなら、あなたのアプリケーションにライブラリをそのままパッケージングするという手もあります。Beautiful Soupのライセンスはそれを認めています。.tar.gz形式でダウンロードし、アプリケーションのソースコード内に <tt class="docutils literal"><span class="pre">bs4</span></tt> ディレクトリをコピーしてください。そうすれば、Beautiful Soupをインストールすることなしに使うことができます。</p> +<p>私は、Python 2.7とPython 3.2でBeautiful Soupを開発しましたが、他の最近のバージョンでも動くはずです。</p> +<div class="section" id="id9"> +<h2>インストール後の問題<a class="headerlink" href="#id9" title="Permalink to this headline">¶</a></h2> +<p>Beautiful SoupはPython 2のコードとしてパッケージされています。 +Beautiful SoupをPython 3環境で使おうとしてインストールすると、それは自動的にPython 3のコードとして変換されます。 +もし、Beautiful Soupパッケージをインストールしないと、コードは変換されません。 +Windowsでは、間違ったバージョンが入っていると、それが報告されます。</p> +<p><tt class="docutils literal"><span class="pre">ImportError</span></tt> “No module named HTMLParser” というエラーが表示されたら、それはPython 3環境でPython 2で書かれたコードを実行しようとしたためです。</p> +<p><tt class="docutils literal"><span class="pre">ImportError</span></tt> “No module named html.parser” というエラーが表示されたら、それはPython 2環境でPython 3ので書かれたコードを実行しようとしたためです。</p> +<p>どちらの場合もとるべき対応は、Beautiful Soupを(tarballを解凍したときディレクトリを含め) +完全にアンインストールして、再インストールをすることです。</p> +<p><tt class="docutils literal"><span class="pre">ROOT_TAG_NAME</span> <span class="pre">=</span> <span class="pre">u'[document]'</span></tt> 行で <tt class="docutils literal"><span class="pre">SyntaxError</span></tt> “Invalid syntax” のエラーが表示されたら、 +Python 2で書かれたBeautiful SoupのコードをPython 3に変換しなければいけません。</p> +<p>そのためには、次のようにパッケージをインストールするか、:</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">python3</span> <span class="pre">setup.py</span> <span class="pre">install</span></tt></p> +<p>もしくは、手動で <tt class="docutils literal"><span class="pre">2to3</span></tt> 変換スクリプトを <tt class="docutils literal"><span class="pre">bs4</span></tt> ディレクトリで実行すればできます。:</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">2to3-3.2</span> <span class="pre">-w</span> <span class="pre">bs4</span></tt></p> +</div> +<div class="section" id="parser-installation"> +<span id="id10"></span><h2>パーサーのインストール<a class="headerlink" href="#parser-installation" title="Permalink to this headline">¶</a></h2> +<p>Beautiful SoupはPythonの標準ライブラリに入っているHTMLパーサーをサポートすると同時に、多くのサードパーティーのPythonパーサーもサポートしています。一つには、 <a class="reference external" href="http://lxml.de/">lxml parser</a>. があります。環境に依りますが、以下のコマンドのどれかでlxmlをインストールできるでしょう。:</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-lxml</span></tt></p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">lxml</span></tt></p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">lxml</span></tt></p> +<p>別の選択肢として、Python純正の <a class="reference external" href="http://code.google.com/p/html5lib/">html5lib parser</a> が挙げられます。これは HTMLをwebブラウザがするようにパースします。これも環境に依りますが、以下のコマンドのどれかでhtml5libをインストールできるでしょう。:</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-html5lib</span></tt></p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">html5lib</span></tt></p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">html5lib</span></tt></p> +<p>以下の表は、各パーサーのライブラリの強みと弱みをまとめてあります。</p> +<table border="1" class="docutils"> +<colgroup> +<col width="17%" /> +<col width="33%" /> +<col width="25%" /> +<col width="25%" /> +</colgroup> +<tbody valign="top"> +<tr class="row-odd"><td>パーサー</td> +<td>使用例</td> +<td>強み</td> +<td>弱み</td> +</tr> +<tr class="row-even"><td>Python’s html.parser</td> +<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">"html.parser")</span></tt></td> +<td><ul class="first last simple"> +<li>標準ライブラリ</li> +<li>まずまずのスピード</li> +<li>Python2.7.3/3.2.2以降に対応</li> +</ul> +</td> +<td><ul class="first last simple"> +<li>Python2.7.3/3.2.2未満は非対応</li> +</ul> +</td> +</tr> +<tr class="row-odd"><td>lxml’s HTML parser</td> +<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">"lxml")</span></tt></td> +<td><ul class="first last simple"> +<li>爆速</li> +<li>対応(?)</li> +</ul> +</td> +<td><ul class="first last simple"> +<li>外部Cライブラリに依存</li> +</ul> +</td> +</tr> +<tr class="row-even"><td>lxml’s XML parser</td> +<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">["lxml",</span> <span class="pre">"xml"])</span></tt> +<tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">"xml")</span></tt></td> +<td><ul class="first last simple"> +<li>爆速</li> +<li>唯一の対応XMLパーサー</li> +</ul> +</td> +<td><ul class="first last simple"> +<li>外部Cライブラリに依存</li> +</ul> +</td> +</tr> +<tr class="row-odd"><td>html5lib</td> +<td><tt class="docutils literal"><span class="pre">BeautifulSoup(markup,</span> <span class="pre">"html5lib")</span></tt></td> +<td><ul class="first last simple"> +<li>対応度高</li> +<li>WEBブラウザと同じようにパース</li> +<li>正しいHTML5を生成</li> +</ul> +</td> +<td><ul class="first last simple"> +<li>とても遅い</li> +<li>外部Pythonライブラリに依存</li> +</ul> +</td> +</tr> +</tbody> +</table> +<p>できれば、速度のためにlxmlをインストールして使うことをお薦めします。 +とくに、あなたがPython2.7.3のPython2系か、Python3.2.2より前のPython3系を使っているばあいは、lxmlかhtml5libをインストールすることは <strong>とても大事です</strong> 。 +なぜなら、Pythonにはじめから組み込まれているHTMLパーサーは、古いバージョンのPythonではそこまで良く動かないからです。</p> +<p>構文が不正確なドキュメントのときは、パーサーが違うと生成されるパースツリーが異なってくることに注意してください。 +詳しくは、 <a class="reference internal" href="#id47">パーサーの違い</a> を参照のこと。</p> +</div> +</div> +<div class="section" id="id11"> +<h1>スープの作成<a class="headerlink" href="#id11" title="Permalink to this headline">¶</a></h1> +<p>ドキュメントをパース(構文解析)するには、 +そのドキュメントを <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> コンストラクタに渡します。 +文字列でも開いたファイルハンドルでも渡せます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span> + +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="s">"index.html"</span><span class="p">))</span> + +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<html>data</html>"</span><span class="p">)</span> +</pre></div> +</div> +<p>最初に、ドキュメントはUnicodeに変換され、HTMLエンティティはUnicode文字列に変換されます。:</p> +<div class="highlight-python"><pre>BeautifulSoup("Sacr&eacute; bleu!") +<html><head></head><body>Sacré bleu!</body></html></pre> +</div> +<p>Beautiful Soupは、ドキュメントをもっとも適したパーサー(構文解析器)を使ってパースします。 +XMLパーサーを使うように指定しなければ、HTMLパーサーが用いられます。( <a class="reference internal" href="#xml">XMLのパース</a> を参照)</p> +</div> +<div class="section" id="id12"> +<h1>4種類のオブジェクト<a class="headerlink" href="#id12" title="Permalink to this headline">¶</a></h1> +<p>Beautiful Soup は複雑なHTMLドキュメントを、Pythonオブジェクトの複雑なツリー構造に変換します。 +しかし、あなたは <tt class="docutils literal"><span class="pre">Tag</span></tt>, <tt class="docutils literal"><span class="pre">NavigableString</span></tt>, <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt>, <tt class="docutils literal"><span class="pre">Comment</span></tt> +の <strong>4種類のオブジェクト</strong> だけを扱えばよいです。</p> +<div class="section" id="tag-obj"> +<span id="tag"></span><h2>Tag obj.<a class="headerlink" href="#tag-obj" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトは、元のドキュメント内のXMLやHTMLのタグに対応しています。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<b class="boldest">Extremely bold</b>'</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span> +<span class="nb">type</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> +<span class="c"># <class 'bs4.element.Tag'></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトは、多くの属性とメソッドを持っています。それらのほとんどは、 <a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a> で説明します。この節では <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトの重要な機能である、名前と属性について説明します。</p> +<div class="section" id="id13"> +<h3>名前<a class="headerlink" href="#id13" title="Permalink to this headline">¶</a></h3> +<p>タグはそれぞれ名前を持っていますが、 <tt class="docutils literal"><span class="pre">.name</span></tt> でアクセスできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">name</span> +<span class="c"># u'b'</span> +</pre></div> +</div> +<p>タグの名前を変えると、その変更はBeautiful Soupが生成する全てのマークアップに反映されます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"blockquote"</span> +<span class="n">tag</span> +<span class="c"># <blockquote class="boldest">Extremely bold</blockquote></span> +</pre></div> +</div> +</div> +<div class="section" id="id14"> +<h3>属性<a class="headerlink" href="#id14" title="Permalink to this headline">¶</a></h3> +<p>タグは多くの属性を持ちます。 +<b class=”boldest”>は、”boldest”という値の’class’属性を持ちます。 +<tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトを辞書のように扱うことで、そのタグの属性にアクセスできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="c"># u'boldest'</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">.attrs</span></tt> で辞書に直接アクセスできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">attrs</span> +<span class="c"># {u'class': u'boldest'}</span> +</pre></div> +</div> +<p>繰り返しになりますが、辞書のように <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトを扱うことにより、タグの属性に対して追加, 削除, 修正も行うことができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'verybold'</span> +<span class="n">tag</span><span class="p">[</span><span class="s">'id'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> +<span class="n">tag</span> +<span class="c"># <blockquote class="verybold" id="1">Extremely bold</blockquote></span> + +<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">'id'</span><span class="p">]</span> +<span class="n">tag</span> +<span class="c"># <blockquote>Extremely bold</blockquote></span> + +<span class="n">tag</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="c"># KeyError: 'class'</span> +<span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s">'class'</span><span class="p">))</span> +<span class="c"># None</span> +</pre></div> +</div> +<span class="target" id="multivalue"></span><div class="section" id="id15"> +<h4>値が複数のとき<a class="headerlink" href="#id15" title="Permalink to this headline">¶</a></h4> +<p>HTML4は、値を複数もてる2,3の属性を定義しています。 +HTML5で、それらはなくなりましたが、別の同様の属性が定義されました。 +もっとも一般的な値を複数もつ属性は <tt class="docutils literal"><span class="pre">class</span></tt> です。(たとえば、HTMLタグは複数のCSSクラスを持つことができます) +また他の複数の値を持つ属性としては、 <tt class="docutils literal"><span class="pre">rel</span></tt>, <tt class="docutils literal"><span class="pre">rev</span></tt>, <tt class="docutils literal"><span class="pre">accept-charset</span></tt>, <tt class="docutils literal"><span class="pre">headers</span></tt>, <tt class="docutils literal"><span class="pre">accesskey</span></tt> があります。 +Beautiful Soupは、これらの属性がもつ複数の値をリストとして示します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<p class="body strikeout"></p>'</span><span class="p">)</span> +<span class="n">css_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="c"># ["body", "strikeout"]</span> + +<span class="n">css_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<p class="body"></p>'</span><span class="p">)</span> +<span class="n">css_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="c"># ["body"]</span> +</pre></div> +</div> +<p>ある属性が複数の値をもっているようでも、HTML標準の定義から外れている場合、Beautiful Soupはその属性をひとまとまりの値として扱います。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">id_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<p id="my id"></p>'</span><span class="p">)</span> +<span class="n">id_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">'id'</span><span class="p">]</span> +<span class="c"># 'my id'</span> +</pre></div> +</div> +<p>タグを文字列に変換したときは、これらの属性の複数の値は一つにまとめられます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">rel_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<p>Back to the <a rel="index">homepage</a></p>'</span><span class="p">)</span> +<span class="n">rel_soup</span><span class="o">.</span><span class="n">a</span><span class="p">[</span><span class="s">'rel'</span><span class="p">]</span> +<span class="c"># ['index']</span> +<span class="n">rel_soup</span><span class="o">.</span><span class="n">a</span><span class="p">[</span><span class="s">'rel'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="s">'index'</span><span class="p">,</span> <span class="s">'contents'</span><span class="p">]</span> +<span class="k">print</span><span class="p">(</span><span class="n">rel_soup</span><span class="o">.</span><span class="n">p</span><span class="p">)</span> +<span class="c"># <p>Back to the <a rel="index contents">homepage</a></p></span> +</pre></div> +</div> +<p>ドキュメントをXMLとしてパースすると、値を複数もつ属性はなくなります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">xml_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<p class="body strikeout"></p>'</span><span class="p">,</span> <span class="s">'xml'</span><span class="p">)</span> +<span class="n">xml_soup</span><span class="o">.</span><span class="n">p</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="c"># u'body strikeout'</span> +</pre></div> +</div> +</div> +</div> +</div> +<div class="section" id="navigablestring-obj"> +<h2>NavigableString obj.<a class="headerlink" href="#navigablestring-obj" title="Permalink to this headline">¶</a></h2> +<p>タグの組に挟まれる短い(ドキュメントの本文のテキスト)文字列があります。 +Beautiful Soupは、これらの文字列を表すのに <tt class="docutils literal"><span class="pre">NavigableString</span></tt> クラスを用います。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">string</span> +<span class="c"># u'Extremely bold'</span> +<span class="nb">type</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">string</span><span class="p">)</span> +<span class="c"># <class 'bs4.element.NavigableString'></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトは、PythonのUnicode型のように振るまいます。 +また、<a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a> に述べられている機能のいくつかもサポートします。 +<tt class="docutils literal"><span class="pre">unicode()</span></tt> を用いて、 <tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトをUnicode型に変換できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">unicode_string</span> <span class="o">=</span> <span class="nb">unicode</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">string</span><span class="p">)</span> +<span class="n">unicode_string</span> +<span class="c"># u'Extremely bold'</span> +<span class="nb">type</span><span class="p">(</span><span class="n">unicode_string</span><span class="p">)</span> +<span class="c"># <type 'unicode'></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> の文字列は編集できませんが、 <a class="reference internal" href="#replace-with"><em>replace_with()</em></a> を使って、他の文字列に置換することはできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">tag</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">replace_with</span><span class="p">(</span><span class="s">"No longer bold"</span><span class="p">)</span> +<span class="n">tag</span> +<span class="c"># <blockquote>No longer bold</blockquote></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> は、<a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a> で述べられている機能のほとんどをサポートします。 +しかし、全てをサポートしているわけではありません。 +とくに、<tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトが文字列や別の <tt class="docutils literal"><span class="pre">Tag</span></tt> を内に含むのに対して、<tt class="docutils literal"><span class="pre">string</span></tt> オブジェクトは何も持たず、<cite>.contents`</cite> 属性, <tt class="docutils literal"><span class="pre">.string</span></tt> 属性, <tt class="docutils literal"><span class="pre">find()</span></tt> メソッドをサポートしません。</p> +<p><tt class="docutils literal"><span class="pre">NavigableString</span></tt> をBeautiful Soupの外で使いたい場合は、 <tt class="docutils literal"><span class="pre">unicode()</span></tt> を使ってPythonのUnicode文字列に変換するべきです。そうしないと、Beautiful Soupを使い終わった後も、Beautiful Soupのパースツリー全体へのリファレンスを持ち続けることになり、メモリを大量に浪費します。</p> +</div> +<div class="section" id="beautifulsoup-obj"> +<h2>BeautifulSoup obj.<a class="headerlink" href="#beautifulsoup-obj" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトは、それ自身で元のドキュメント全体を表しています。 +たいていの場合、<a class="reference internal" href="#tag"><em>Tag obj.</em></a> を扱うことで、用は足りるでしょう。 +これは、<a class="reference internal" href="#tag"><em>Tag obj.</em></a> が <a class="reference internal" href="#id16">パースツリーを探索</a> と <a class="reference internal" href="#id25">パースツリーを検索</a>. で述べられているメソッドの多くをサポートしているということです。</p> +<p><tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトは、実際のHTMLやXMLタグに対応していないので、名前や属性を持たない。 +しかし、 <tt class="docutils literal"><span class="pre">.name</span></tt> をみるような便利なものはいくつかある。そして、それらは特別な <tt class="docutils literal"><span class="pre">.name</span></tt> “[document]”を得られる(?訳がおかしい。けど次回まわし?):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">name</span> +<span class="c"># u'[document]'</span> +</pre></div> +</div> +</div> +<div class="section" id="comments-obj"> +<h2>Comments obj. 他<a class="headerlink" href="#comments-obj" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag</span></tt>, <tt class="docutils literal"><span class="pre">NavigableString</span></tt>, <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> はHTMLやXMLファイルのほぼ全てをカバーします。しかし、少しだけ残ったものがあります。それはコメントについてです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">"<b><!--Hey, buddy. Want to buy a used parser?--></b>"</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">comment</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span> +<span class="nb">type</span><span class="p">(</span><span class="n">comment</span><span class="p">)</span> +<span class="c"># <class 'bs4.element.Comment'></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">Comment</span></tt> オブジェクトは、 <tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトの特別なタイプです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">comment</span> +<span class="c"># u'Hey, buddy. Want to buy a used parser'</span> +</pre></div> +</div> +<p>コメントはHTMLの中にあらわれますが、 <tt class="docutils literal"><span class="pre">Comment</span></tt> は特別な書式で表示されます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <b></span> +<span class="c"># <!--Hey, buddy. Want to buy a used parser?--></span> +<span class="c"># </b></span> +</pre></div> +</div> +<p>Beautiful Soupは、XMLドキュメントのなかの他の全ての要素をクラス定義しています。 +<tt class="docutils literal"><span class="pre">CData</span></tt>, <tt class="docutils literal"><span class="pre">ProcessingInstruction</span></tt>, <tt class="docutils literal"><span class="pre">Declaration</span></tt>, <tt class="docutils literal"><span class="pre">Doctype</span></tt>. +<tt class="docutils literal"><span class="pre">Comment</span></tt> クラスのように、これらは文字に何かを加えた <tt class="docutils literal"><span class="pre">NavigableString</span></tt> のサブクラスです。 +ここでは、コメントをCDDATAブロックに置換した例を示します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">CData</span> +<span class="n">cdata</span> <span class="o">=</span> <span class="n">CData</span><span class="p">(</span><span class="s">"A CDATA block"</span><span class="p">)</span> +<span class="n">comment</span><span class="o">.</span><span class="n">replace_with</span><span class="p">(</span><span class="n">cdata</span><span class="p">)</span> + +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <b></span> +<span class="c"># <![CDATA[A CDATA block]]></span> +<span class="c"># </b></span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="id16"> +<h1>パースツリーを探索<a class="headerlink" href="#id16" title="Permalink to this headline">¶</a></h1> +<p>ここで再び “Three sisters” のHTMLドキュメントです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">"""</span> +<span class="s"><html><head><title>The Dormouse's story</title></head></span> + +<span class="s"><p class="title"><b>The Dormouse's story</b></p></span> + +<span class="s"><p class="story">Once upon a time there were three little sisters; and their names were</span> +<span class="s"><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,</span> +<span class="s"><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and</span> +<span class="s"><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;</span> +<span class="s">and they lived at the bottom of a well.</p></span> + +<span class="s"><p class="story">...</p></span> +<span class="s">"""</span> + +<span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span> +</pre></div> +</div> +<p>ドキュメントのある部分から他の部分へどのように移動するかを示すために、このドキュメントを例に使っていきます。</p> +<div class="section" id="id17"> +<h2>子要素へ下移動<a class="headerlink" href="#id17" title="Permalink to this headline">¶</a></h2> +<p>タグはその間に(ドキュメント本文のテキスト)文字列や他のタグを挟んでいます。これらの要素は、 タグの <cite>子要素</cite> です。Beautiful Soupは、タグの子要素を探索し扱うための多くの属性を提供します。</p> +<p>Beautiful Soupの文字列は、これらの属性をサポートしません。なぜなら、文字列は子要素をもたないからです。</p> +<div class="section" id="id18"> +<h3>タグ名で探索<a class="headerlink" href="#id18" title="Permalink to this headline">¶</a></h3> +<p>パースツリーを探索する一番簡単な方法は、あなたが取得したいタグの名前を使うことです。 +もし、<head> タグを取得したければ、 <tt class="docutils literal"><span class="pre">soup.head</span></tt> と入力すればよいです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">head</span> +<span class="c"># <head><title>The Dormouse's story</title></head></span> + +<span class="n">soup</span><span class="o">.</span><span class="n">title</span> +<span class="c"># <title>The Dormouse's story</title></span> +</pre></div> +</div> +<p>また、パースツリーのある部分から出発して、何度もズームインを繰り返す方法もあります。 +このコードは、<body>タグ以下の最初の<b>タグを取得します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">body</span><span class="o">.</span><span class="n">b</span> +<span class="c"># <b>The Dormouse's story</b></span> +</pre></div> +</div> +<p>属性としてタグ名を使うと、その名前のタグのうち <cite>最初</cite> にあるものを取得できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> +</pre></div> +</div> +<p><cite>全ての</cite> <a>タグを取得したいときや、ある名前のタグのうち2番目以降のものをしたいときは、 <a class="reference internal" href="#id25">パースツリーを検索</a> で述べられている <cite>find_all()</cite> のようなメソッドを使う必要があります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'a'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +</div> +<div class="section" id="contents-children"> +<h3><tt class="docutils literal"><span class="pre">.contents</span></tt> / <tt class="docutils literal"><span class="pre">.children</span></tt><a class="headerlink" href="#contents-children" title="Permalink to this headline">¶</a></h3> +<p>タグの子要素は、 <tt class="docutils literal"><span class="pre">.contents</span></tt> で呼び出すと、リストで取得できます。:</p> +<div class="highlight-python"><pre>head_tag = soup.head +head_tag +# <head><title>The Dormouse's story</title></head> + +head_tag.contents +[<title>The Dormouse's story</title>] + +title_tag = head_tag.contents[0] +title_tag +# <title>The Dormouse's story</title> +title_tag.contents +# [u'The Dormouse's story']</pre> +</div> +<p><tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトは、それ自身が子要素を持ちます。この場合、<html>タグが <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトの子要素になります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="nb">len</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">contents</span><span class="p">)</span> +<span class="c"># 1</span> +<span class="n">soup</span><span class="o">.</span><span class="n">contents</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">name</span> +<span class="c"># u'html'</span> +</pre></div> +</div> +<p>文字列は <tt class="docutils literal"><span class="pre">.contents</span></tt> を持ちません。なぜなら、文字列は何も挟まないからです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">text</span> <span class="o">=</span> <span class="n">title_tag</span><span class="o">.</span><span class="n">contents</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> +<span class="n">text</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># AttributeError: 'NavigableString' object has no attribute 'contents'</span> +</pre></div> +</div> +<p>タグの子要素を、リストの代わりに、 <cite>.children</cite> ジェネレーターを用いてイテレーターで扱うこともできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">title_tag</span><span class="o">.</span><span class="n">children</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="n">child</span><span class="p">)</span> +<span class="c"># The Dormouse's story</span> +</pre></div> +</div> +</div> +<div class="section" id="descendants"> +<h3><tt class="docutils literal"><span class="pre">.descendants</span></tt><a class="headerlink" href="#descendants" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">.contents</span></tt> と <tt class="docutils literal"><span class="pre">.children</span></tt> 属性は、あるタグの <cite>直下の</cite> 子要素のみを表します。 +例えば、<head>タグは、ただ一つの直下の子要素である<title>タグを持ちます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">head_tag</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> +</pre></div> +</div> +<p>しかし、この<title>タグ自身も、子要素に”The Dormouse’s story”文字列を持ちます。 +この文字列もまた、<head>タグの子要素であるという意味になります。 +そこで、 <tt class="docutils literal"><span class="pre">.descendants</span></tt> (子孫) 属性を用いると、 あるタグの <strong>全ての</strong> 子要素を再帰的に取り出すことができます。 +再帰的というのは、直下の子要素、そのまた子要素、そしてさらにといったふうに繰り返してということです。</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">child</span> <span class="ow">in</span> <span class="n">head_tag</span><span class="o">.</span><span class="n">descendants</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="n">child</span><span class="p">)</span> +<span class="c"># <title>The Dormouse's story</title></span> +<span class="c"># The Dormouse's story</span> +</pre></div> +</div> +<p>このドキュメントの<head>タグはただ1つの子要素しか持ちませんが、 +<title>タグと<title>タグの子要素という2つの子孫要素を持ちます。 +また、このドキュメントの <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトには、 +直下の子要素は<html>タグ1つしかありませんが、子孫要素はたくさんあります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">children</span><span class="p">))</span> +<span class="c"># 1</span> +<span class="nb">len</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">descendants</span><span class="p">))</span> +<span class="c"># 25</span> +</pre></div> +</div> +</div> +<div class="section" id="string"> +<span id="id19"></span><h3><tt class="docutils literal"><span class="pre">.string</span></tt><a class="headerlink" href="#string" title="Permalink to this headline">¶</a></h3> +<p>ある <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトが1つだけ子要素をもっていて、その子要素が <tt class="docutils literal"><span class="pre">NavigableString</span></tt> オブジェクトならば、 <tt class="docutils literal"><span class="pre">.string</span></tt> 属性で利用できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">title_tag</span><span class="o">.</span><span class="n">string</span> +<span class="c"># u'The Dormouse's story'</span> +</pre></div> +</div> +<p>ある <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトのただ1つの子要素が、別の <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトであって <tt class="docutils literal"><span class="pre">.string</span></tt> 属性を持つならば、元の <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトも同じ <tt class="docutils literal"><span class="pre">.string</span></tt> 属性を持つと考えられます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">head_tag</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> + +<span class="n">head_tag</span><span class="o">.</span><span class="n">string</span> +<span class="c"># u'The Dormouse's story'</span> +</pre></div> +</div> +<p>ある <tt class="docutils literal"><span class="pre">tag</span></tt> オブジェクトが複数の子要素を持ち、 <tt class="docutils literal"><span class="pre">.string</span></tt> 属性がどの子要素を参照しているかわからないとき、 <tt class="docutils literal"><span class="pre">.string</span></tt> 属性は <tt class="docutils literal"><span class="pre">None</span></tt> と定義されます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">string</span><span class="p">)</span> +<span class="c"># None</span> +</pre></div> +</div> +</div> +<div class="section" id="strings-stripped-strings"> +<span id="string-generators"></span><h3><tt class="docutils literal"><span class="pre">.strings</span></tt> / <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt><a class="headerlink" href="#strings-stripped-strings" title="Permalink to this headline">¶</a></h3> +<p>あるタグの中にあるドキュメント本文が要素が複数であっても、それらの文字列をみることができます。 +その場合は、 <tt class="docutils literal"><span class="pre">.strings</span></tt> ジェネレーターを使用します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">strings</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">string</span><span class="p">))</span> +<span class="c"># u"The Dormouse's story"</span> +<span class="c"># u'\n\n'</span> +<span class="c"># u"The Dormouse's story"</span> +<span class="c"># u'\n\n'</span> +<span class="c"># u'Once upon a time there were three little sisters; and their names were\n'</span> +<span class="c"># u'Elsie'</span> +<span class="c"># u',\n'</span> +<span class="c"># u'Lacie'</span> +<span class="c"># u' and\n'</span> +<span class="c"># u'Tillie'</span> +<span class="c"># u';\nand they lived at the bottom of a well.'</span> +<span class="c"># u'\n\n'</span> +<span class="c"># u'...'</span> +<span class="c"># u'\n'</span> +</pre></div> +</div> +<p>これらの文字列は、大量の余計な空白が入りがちである。 +そこで、 <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt> ジェネレーターを代わりに用いることで、それら空白を除くことができる。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">string</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">stripped_strings</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">string</span><span class="p">))</span> +<span class="c"># u"The Dormouse's story"</span> +<span class="c"># u"The Dormouse's story"</span> +<span class="c"># u'Once upon a time there were three little sisters; and their names were'</span> +<span class="c"># u'Elsie'</span> +<span class="c"># u','</span> +<span class="c"># u'Lacie'</span> +<span class="c"># u'and'</span> +<span class="c"># u'Tillie'</span> +<span class="c"># u';\nand they lived at the bottom of a well.'</span> +<span class="c"># u'...'</span> +</pre></div> +</div> +<p>ここでは、文字列中に入る空白はそのままで、文字列の最初や最後に付く空白は削除されます。</p> +</div> +</div> +<div class="section" id="id20"> +<h2>親要素へ上移動<a class="headerlink" href="#id20" title="Permalink to this headline">¶</a></h2> +<p>“家族ツリー”に例えると、全てのタグや文字列はそれぞれが一つの親要素を持ちます。</p> +<div class="section" id="parent"> +<span id="id21"></span><h3><tt class="docutils literal"><span class="pre">.parent</span></tt><a class="headerlink" href="#parent" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">.parent</span></tt> 属性で親要素にアクセスできます。 +たとえば、”three sisters”ドキュメントでは、<head>タグは<title>タグの親要素です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">title_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">title</span> +<span class="n">title_tag</span> +<span class="c"># <title>The Dormouse's story</title></span> +<span class="n">title_tag</span><span class="o">.</span><span class="n">parent</span> +<span class="c"># <head><title>The Dormouse's story</title></head></span> +</pre></div> +</div> +<p>タイトル文字列はそれ自身が親要素を持ち、<title>タグはタイトル文字列を子要素に持ちます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">title_tag</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">parent</span> +<span class="c"># <title>The Dormouse's story</title></span> +</pre></div> +</div> +<p><html>タグの様なトップレベルのタグは、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトそれ自身になります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">html_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">html</span> +<span class="nb">type</span><span class="p">(</span><span class="n">html_tag</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span> +<span class="c"># <class 'bs4.BeautifulSoup'></span> +</pre></div> +</div> +<p>そして、<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">.parent</span></tt> 属性は、Noneになります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span> +<span class="c"># None</span> +</pre></div> +</div> +</div> +<div class="section" id="parents"> +<span id="id22"></span><h3><tt class="docutils literal"><span class="pre">.parents</span></tt><a class="headerlink" href="#parents" title="Permalink to this headline">¶</a></h3> +<p>あるタグに対する祖先要素全てを <tt class="docutils literal"><span class="pre">.parents</span></tt> で取得することができます。 +以下は、HTMLドキュメントの深いところにある<a>タグからスタートして、最上層まで辿っています。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="n">link</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> +<span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">link</span><span class="o">.</span><span class="n">parents</span><span class="p">:</span> + <span class="k">if</span> <span class="n">parent</span> <span class="ow">is</span> <span class="bp">None</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="n">parent</span><span class="p">)</span> + <span class="k">else</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="n">parent</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> +<span class="c"># p</span> +<span class="c"># body</span> +<span class="c"># html</span> +<span class="c"># [document]</span> +<span class="c"># None</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="id23"> +<h2>兄弟要素へ横移動<a class="headerlink" href="#id23" title="Permalink to this headline">¶</a></h2> +<p>以下のようなシンプルなHTMLドキュメントを考えてみましょう。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">sibling_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a><b>text1</b><c>text2</c></b></a>"</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <html></span> +<span class="c"># <body></span> +<span class="c"># <a></span> +<span class="c"># <b></span> +<span class="c"># text1</span> +<span class="c"># </b></span> +<span class="c"># <c></span> +<span class="c"># text2</span> +<span class="c"># </c></span> +<span class="c"># </a></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p><b>タグは<c>タグと同じレベルにあります。つまり、2つはともに同じタグの直下の子要素ということです。 +こういった関係にあるタグを <cite>siblings</cite> (兄弟)といいます。 +HTMLドキュメントをきれいに出力(?)したとき、siblingsは同じインデントレベルになります。 +こういったタグの関係をコードで利用することができます。</p> +<div class="section" id="next-sibling-previous-sibling"> +<h3><tt class="docutils literal"><span class="pre">.next_sibling</span></tt> / <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt><a class="headerlink" href="#next-sibling-previous-sibling" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">.next_sibling</span></tt> と <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> を用いて、パースツリーの同じレベルの要素間を辿ることができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">next_sibling</span> +<span class="c"># <c>text2</c></span> + +<span class="n">sibling_soup</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">previous_sibling</span> +<span class="c"># <b>text1</b></span> +</pre></div> +</div> +<p>この<b>タグは <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> は持ちますが、 <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> は持ちません。 +なぜなら、<b>タグの前にはパースツリーで同レベルの要素がないからです。 +同様に、<c>タグは <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> を持ちますが、<tt class="docutils literal"><span class="pre">.next_sibling</span></tt> は持ちません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">previous_sibling</span><span class="p">)</span> +<span class="c"># None</span> +<span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">c</span><span class="o">.</span><span class="n">next_sibling</span><span class="p">)</span> +<span class="c"># None</span> +</pre></div> +</div> +<p>“text1”と”text”は兄弟ではありません。なぜなら、2つは同じ親をもたないからです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span> +<span class="c"># u'text1'</span> + +<span class="k">print</span><span class="p">(</span><span class="n">sibling_soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">next_sibling</span><span class="p">)</span> +<span class="c"># None</span> +</pre></div> +</div> +<p>実際のHTMLドキュメントをパースすると、 <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> や <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt> は前後に空白を持ちます。 +“three sisters”ドキュメントで見てみましょう。:</p> +<div class="highlight-python"><pre><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a> +<a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> +<a href="http://example.com/tillie" class="sister" id="link3">Tillie</a></pre> +</div> +<p>すなおに考えれば、最初の<a>タグの <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> は2番目の<a>タグとなるはずですが、実際は違います。 +それは、最初の<a>タグと2番目を分ける”コンマと改行コード”という文字列になります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="n">link</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> + +<span class="n">link</span><span class="o">.</span><span class="n">next_sibling</span> +<span class="c"># u',\n'</span> +</pre></div> +</div> +<p>2番目の<a>タグは、そのコンマと改行コードの <tt class="docutils literal"><span class="pre">.next_sibling</span></tt> になります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">link</span><span class="o">.</span><span class="n">next_sibling</span><span class="o">.</span><span class="n">next_sibling</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a></span> +</pre></div> +</div> +</div> +<div class="section" id="next-siblings-previous-siblings"> +<span id="sibling-generators"></span><h3><tt class="docutils literal"><span class="pre">.next_siblings</span></tt> / <tt class="docutils literal"><span class="pre">.previous_siblings</span></tt><a class="headerlink" href="#next-siblings-previous-siblings" title="Permalink to this headline">¶</a></h3> +<p>複数の兄弟要素を <tt class="docutils literal"><span class="pre">.next_siblings</span></tt> や <tt class="docutils literal"><span class="pre">.previous_siblings</span></tt> をイテレーターとして使って、まとめて扱えます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">sibling</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">next_siblings</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">sibling</span><span class="p">))</span> +<span class="c"># u',\n'</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a></span> +<span class="c"># u' and\n'</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a></span> +<span class="c"># u'; and they lived at the bottom of a well.'</span> +<span class="c"># None</span> + +<span class="k">for</span> <span class="n">sibling</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">"link3"</span><span class="p">)</span><span class="o">.</span><span class="n">previous_siblings</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">sibling</span><span class="p">))</span> +<span class="c"># ' and\n'</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a></span> +<span class="c"># u',\n'</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> +<span class="c"># u'Once upon a time there were three little sisters; and their names were\n'</span> +<span class="c"># None</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="id24"> +<h2>前後の要素へ移動<a class="headerlink" href="#id24" title="Permalink to this headline">¶</a></h2> +<p>“three sisters”ドキュメントのはじめの部分を見てみましょう。:</p> +<div class="highlight-python"><pre><html><head><title>The Dormouse's story</title></head> +<p class="title"><b>The Dormouse's story</b></p></pre> +</div> +<p>HTMLパーサーは、この文字列を読み込み、イベントの連なりとして理解します。”open an <html> tag”, “open a <head> tag”, “open a <title> tag”, “add a string”, “close the <title> tag”, “open a <p>”... といったかんじです。Beautiful Soupはこのイベントの連なりを、さらに再構成して扱います。</p> +<div class="section" id="next-element-previous-element"> +<span id="element-generators"></span><h3><tt class="docutils literal"><span class="pre">.next_element</span></tt> / <tt class="docutils literal"><span class="pre">.previous_element</span></tt><a class="headerlink" href="#next-element-previous-element" title="Permalink to this headline">¶</a></h3> +<p>文字列やHTMLタグの <tt class="docutils literal"><span class="pre">.next_element</span></tt> 属性は、それの直後の要素を指し示します。 +<tt class="docutils literal"><span class="pre">.next_string</span></tt> と同じようですが、決定的に違います。</p> +<p>“three sisters”ドキュメントの最後の<a>タグについて考えてみましょう。 +それの <tt class="docutils literal"><span class="pre">.next_string</span></tt> はその<a>タグによって分割された文の後ろの部分の文字列です。(?):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">last_a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s">"link3"</span><span class="p">)</span> +<span class="n">last_a_tag</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a></span> + +<span class="n">last_a_tag</span><span class="o">.</span><span class="n">next_sibling</span> +<span class="c"># '; and they lived at the bottom of a well.'</span> +</pre></div> +</div> +<p>一方、 <tt class="docutils literal"><span class="pre">.next_element</span></tt> は、<a>タグのすぐ後ろの要素である”Tillie”という単語を指し示します。文の残りの部分ではありません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">last_a_tag</span><span class="o">.</span><span class="n">next_element</span> +<span class="c"># u'Tillie'</span> +</pre></div> +</div> +<p>これは元の文章で”Tillie”という単語がセミコロンの前に現れるからです。 +パーサーは<a>タグに出会い、次に”Tillie”という単語、そして</a>という閉じるタグがきます。 +そのあとは、セミコロンがあって、文の残りの部分です。 +セミコロンは<a>タグと同じレベルにありますが、”Tillie”という単語が最初に出会います。</p> +<p><tt class="docutils literal"><span class="pre">.previous_element</span></tt> 属性は、 <tt class="docutils literal"><span class="pre">.next_element</span></tt> とは逆です。 +その要素の一つ前の要素を指し示します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">last_a_tag</span><span class="o">.</span><span class="n">previous_element</span> +<span class="c"># u' and\n'</span> +<span class="n">last_a_tag</span><span class="o">.</span><span class="n">previous_element</span><span class="o">.</span><span class="n">next_element</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a></span> +</pre></div> +</div> +</div> +<div class="section" id="next-elements-previous-elements"> +<h3><tt class="docutils literal"><span class="pre">.next_elements</span></tt> / <tt class="docutils literal"><span class="pre">.previous_elements</span></tt><a class="headerlink" href="#next-elements-previous-elements" title="Permalink to this headline">¶</a></h3> +<p>パースされたドキュメントの要素を、前後方向に取得していくイテレーターを使うこともできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">element</span> <span class="ow">in</span> <span class="n">last_a_tag</span><span class="o">.</span><span class="n">next_elements</span><span class="p">:</span> + <span class="k">print</span><span class="p">(</span><span class="nb">repr</span><span class="p">(</span><span class="n">element</span><span class="p">))</span> +<span class="c"># u'Tillie'</span> +<span class="c"># u';\nand they lived at the bottom of a well.'</span> +<span class="c"># u'\n\n'</span> +<span class="c"># <p class="story">...</p></span> +<span class="c"># u'...'</span> +<span class="c"># u'\n'</span> +<span class="c"># None</span> +</pre></div> +</div> +</div> +</div> +</div> +<div class="section" id="id25"> +<h1>パースツリーを検索<a class="headerlink" href="#id25" title="Permalink to this headline">¶</a></h1> +<p>Beautiful Soupはパースパースツリーを検索する多くのメソッドを定義しています。 +しかし、それらはどれもとても似通っています。 +この章では、<tt class="docutils literal"><span class="pre">find()</span></tt> と <tt class="docutils literal"><span class="pre">find_all()</span></tt> という2つの人気のメソッドの説明に、多くのスペースを費やします。 +それ以外のメソッドは、ほとんど同じ引数を持つので、簡単な説明にとどめることにします。</p> +<p>ここでは再び、”three sisters”ドキュメントを例に使っていきます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">"""</span> +<span class="s"><html><head><title>The Dormouse's story</title></head></span> + +<span class="s"><p class="title"><b>The Dormouse's story</b></p></span> + +<span class="s"><p class="story">Once upon a time there were three little sisters; and their names were</span> +<span class="s"><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,</span> +<span class="s"><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and</span> +<span class="s"><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;</span> +<span class="s">and they lived at the bottom of a well.</p></span> + +<span class="s"><p class="story">...</p></span> +<span class="s">"""</span> + +<span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> のようなフィルターを通すことにより、 +興味のあるドキュメントのある一部分にズームすることができます。</p> +<div class="section" id="id26"> +<h2>フィルターの種類<a class="headerlink" href="#id26" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> 等のメソッドの詳細を説明するまえに、これらのメソッドに渡すフィルターの例を示します。 +検索APIの使い方をマスターする上で、フィルターは何度もでてきます。 +これにより、タグ名, タグの属性, ドキュメントの文字列やそれを組み合わせた条件を指定して、フィルターをかけます</p> +<span class="target" id="a-string"></span><div class="section" id="id27"> +<h3>文字列<a class="headerlink" href="#id27" title="Permalink to this headline">¶</a></h3> +<p>もっともシンプルなフィルターは文字列です。 +検索メソッドに文字列を渡すと、Beautiful Soupは厳格に文字列を一致させます。 +以下のコードは、ドキュメント内の<b>タグを全て見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'b'</span><span class="p">)</span> +<span class="c"># [<b>The Dormouse's story</b>]</span> +</pre></div> +</div> +<p>バイト文字列を渡すと、Beautiful SoupはそれをUTF-8にエンコードされた文字列として扱います。 +これを避けるには、代わりにUnicode文字列を渡します。</p> +<span class="target" id="a-regular-expression"></span></div> +<div class="section" id="id28"> +<h3>正規表現<a class="headerlink" href="#id28" title="Permalink to this headline">¶</a></h3> +<p>正規表現オブジェクトを渡すと、Beautiful Soupはそれの <tt class="docutils literal"><span class="pre">match()</span></tt> メソッドを用いて、その正規表現に一致するものをマッチさせます。 +以下のコードは、全ての”b”ではじまるつづりの名前のタグを見つけます。 +“three sisters”ドキュメントでは、<body>タグと<b>タグにマッチします。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">import</span> <span class="nn">re</span> +<span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"^b"</span><span class="p">)):</span> + <span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> +<span class="c"># body</span> +<span class="c"># b</span> +</pre></div> +</div> +<p>以下のコードでは、タグ名に”t”のつづりを含むもの全てを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"t"</span><span class="p">)):</span> + <span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> +<span class="c"># html</span> +<span class="c"># title</span> +</pre></div> +</div> +<span class="target" id="a-list"></span></div> +<div class="section" id="id29"> +<h3>リスト<a class="headerlink" href="#id29" title="Permalink to this headline">¶</a></h3> +<p>フィルターにリストで引数をわたすと、Beautiful Soupはそのリストの内のいずれかにマッチした要素を返します。 +以下のコードは、全ての<a>タグと<b>タグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">([</span><span class="s">"a"</span><span class="p">,</span> <span class="s">"b"</span><span class="p">])</span> +<span class="c"># [<b>The Dormouse's story</b>,</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +</div> +<div class="section" id="true"> +<span id="the-value-true"></span><h3>True値<a class="headerlink" href="#true" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">True値</span></tt> は全ての要素にマッチします。 +以下のコードは、ドキュメント内の <strong>全て</strong> のタグをみつけます。 +ただし、ドキュメント本文のテキスト文字列はマッチされません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="bp">True</span><span class="p">):</span> + <span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">name</span><span class="p">)</span> +<span class="c"># html</span> +<span class="c"># head</span> +<span class="c"># title</span> +<span class="c"># body</span> +<span class="c"># p</span> +<span class="c"># b</span> +<span class="c"># p</span> +<span class="c"># a</span> +<span class="c"># a</span> +<span class="c"># a</span> +<span class="c"># p</span> +</pre></div> +</div> +</div> +<div class="section" id="id30"> +<h3>関数<a class="headerlink" href="#id30" title="Permalink to this headline">¶</a></h3> +<p>以上のフィルターで機能が足りないときは、自分で引数に要素をとる関数を定義することもできます。 +その関数は、引数がマッチしたときは <tt class="docutils literal"><span class="pre">True</span></tt> を、そうでないときは <tt class="docutils literal"><span class="pre">False</span></tt> を返します。</p> +<p>以下の関数では、HTMLタグが “class” 属性を持ち、”id”属性を持たない場合に <tt class="docutils literal"><span class="pre">True</span></tt> を返します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">has_class_but_no_id</span><span class="p">(</span><span class="n">tag</span><span class="p">):</span> + <span class="k">return</span> <span class="n">tag</span><span class="o">.</span><span class="n">has_attr</span><span class="p">(</span><span class="s">'class'</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">tag</span><span class="o">.</span><span class="n">has_attr</span><span class="p">(</span><span class="s">'id'</span><span class="p">)</span> +</pre></div> +</div> +<p>この関数を <tt class="docutils literal"><span class="pre">find_all()</span></tt> に渡すと、”three sisters”ドキュメントから全ての<p>タグを取得できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">has_class_but_no_id</span><span class="p">)</span> +<span class="c"># [<p class="title"><b>The Dormouse's story</b></p>,</span> +<span class="c"># <p class="story">Once upon a time there were...</p>,</span> +<span class="c"># <p class="story">...</p>]</span> +</pre></div> +</div> +<p>この関数は<p>タグだけを抽出します。 +<a>タグは”class”と”id”の両方の属性を定義しているので抽出できません。 +<html>や<title>のようなタグは、”class”を定義してないので、同様に抽出できません。</p> +<p>以下の関数は、HTMLタグがstringオブジェクトに囲まれているときは、 <tt class="docutils literal"><span class="pre">True</span></tt> を返します。(?):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">NavigableString</span> +<span class="k">def</span> <span class="nf">surrounded_by_strings</span><span class="p">(</span><span class="n">tag</span><span class="p">):</span> + <span class="k">return</span> <span class="p">(</span><span class="nb">isinstance</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">next_element</span><span class="p">,</span> <span class="n">NavigableString</span><span class="p">)</span> + <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">previous_element</span><span class="p">,</span> <span class="n">NavigableString</span><span class="p">))</span> + +<span class="k">for</span> <span class="n">tag</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">surrounded_by_strings</span><span class="p">):</span> + <span class="k">print</span> <span class="n">tag</span><span class="o">.</span><span class="n">name</span> +<span class="c"># p</span> +<span class="c"># a</span> +<span class="c"># a</span> +<span class="c"># a</span> +<span class="c"># p</span> +</pre></div> +</div> +<p>これで検索メソッドの詳細をみていくことの準備ができました。</p> +</div> +</div> +<div class="section" id="find-all"> +<h2><tt class="docutils literal"><span class="pre">find_all()</span></tt><a class="headerlink" href="#find-all" title="Permalink to this headline">¶</a></h2> +<p>使い方: find_all(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#recursive"><em>recursive</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドは、<cite>Tag</cite> オブジェクトが持つ子孫要素のうち、引数に一致する <strong>全ての</strong> 要素を見つけます。 +<a class="reference internal" href="#id26">フィルターの種類</a> でいくつかの例を挙げましたが、ここでもう少し説明します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="s">"title"</span><span class="p">)</span> +<span class="c"># [<p class="title"><b>The Dormouse's story</b></p>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">"link2"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]</span> + +<span class="kn">import</span> <span class="nn">re</span> +<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"sisters"</span><span class="p">))</span> +<span class="c"># u'Once upon a time there were three little sisters; and their names were\n'</span> +</pre></div> +</div> +<p>これらの使い方は、すでに説明してるものもあれば、初出のものもあります。 +<tt class="docutils literal"><span class="pre">text</span></tt> や <tt class="docutils literal"><span class="pre">id</span></tt> に値を渡すのはどういう意味でしょうか? +なぜ、<tt class="docutils literal"><span class="pre">find_all("p",</span> <span class="pre">"title")</span></tt> は、CSSの”title”タグをもつ<p>タグを発見したのでしょうか? +<tt class="docutils literal"><span class="pre">find_all()</span></tt> の引数をみていきましょう。</p> +<span class="target" id="name"></span><div class="section" id="id31"> +<h3>name引数<a class="headerlink" href="#id31" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> の <tt class="docutils literal"><span class="pre">name</span></tt> 引数に値を渡すと、タグの名前だけを対象に検索が行われます。 +名前がマッチしないタグと同じように、テキスト文字列は無視されます。</p> +<p>以下の例は、もっともシンプルな使い方です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> +</pre></div> +</div> +<p><a class="reference internal" href="#id26">フィルターの種類</a> で述べたように、 <tt class="docutils literal"><span class="pre">name</span></tt> 引数は文字列, 正規表現, リスト, 関数, True値をとることができます。</p> +<span class="target" id="kwargs"></span></div> +<div class="section" id="id32"> +<h3>キーワード引数<a class="headerlink" href="#id32" title="Permalink to this headline">¶</a></h3> +<p>どのような理解できない引数でも、タグの属性の一つとして解釈されます。 +キーワード引数 <tt class="docutils literal"><span class="pre">id</span></tt> に値を渡すと、Beautiful Soupはタグの’id’属性に対してフィルタリングを行います。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">'link2'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]</span> +</pre></div> +</div> +<p>キーワード引数 <tt class="docutils literal"><span class="pre">href</span></tt> に値を渡すと、Beautiful SoupはHTMLタグの’href’属性に対してフィルタリングを行います。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">href</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"elsie"</span><span class="p">))</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]</span> +</pre></div> +</div> +<p>キーワード引数の値もまた、 <a class="reference internal" href="#id27">文字列</a>, <a class="reference internal" href="#id28">正規表現</a>, <a class="reference internal" href="#id29">リスト</a>, <a class="reference internal" href="#id30">関数</a>, <a class="reference internal" href="#true">True値</a> をとることができます。</p> +<p>次のコードは、<tt class="docutils literal"><span class="pre">id</span></tt> 属性に値が入っている全てのタグを見つけます。このとき、値は何でもあっても構いません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +<p>複数のキーワード引数を一度に渡すことによって、複数の属性についてフィルタリングできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">href</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"elsie"</span><span class="p">),</span> <span class="nb">id</span><span class="o">=</span><span class="s">'link1'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">three</a>]</span> +</pre></div> +</div> +<p>HTML5の ‘data-*’ 属性など、いくつかの属性についてはキーワード引数として用いることができません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">data_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<div data-foo="value">foo!</div>'</span><span class="p">)</span> +<span class="n">data_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">data</span><span class="o">-</span><span class="n">foo</span><span class="o">=</span><span class="s">"value"</span><span class="p">)</span> +<span class="c"># SyntaxError: keyword can't be an expression</span> +</pre></div> +</div> +<p>しかし、これらの属性を辞書にして、キーワード引数 <tt class="docutils literal"><span class="pre">attrs</span></tt> として値を渡せばフィルタリングすることができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">data_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s">"data-foo"</span><span class="p">:</span> <span class="s">"value"</span><span class="p">})</span> +<span class="c"># [<div data-foo="value">foo!</div>]</span> +</pre></div> +</div> +<span class="target" id="attrs"></span></div> +<div class="section" id="css"> +<h3>CSSのクラスで検索<a class="headerlink" href="#css" title="Permalink to this headline">¶</a></h3> +<p>HTMLタグが持つCSSのクラスで検索をかけるのはとても便利です。 +しかし”class”はPythonの予約語のため、<tt class="docutils literal"><span class="pre">class</span></tt> をキーワード引数として用いると文法エラーになります。 +そこで、Beautiful Soup 4.1.2からは、 <tt class="docutils literal"><span class="pre">class_</span></tt> というキーワード引数でCSSのクラスを検索できるようになりました。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">"sister"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +<p>他のキーワード引数と同様、 <tt class="docutils literal"><span class="pre">class_</span></tt> には文字列, 正規表現, 関数, True値を渡せます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">class_</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"itl"</span><span class="p">))</span> +<span class="c"># [<p class="title"><b>The Dormouse's story</b></p>]</span> + +<span class="k">def</span> <span class="nf">has_six_characters</span><span class="p">(</span><span class="n">css_class</span><span class="p">):</span> + <span class="k">return</span> <span class="n">css_class</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span> <span class="ow">and</span> <span class="nb">len</span><span class="p">(</span><span class="n">css_class</span><span class="p">)</span> <span class="o">==</span> <span class="mi">6</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">class_</span><span class="o">=</span><span class="n">has_six_characters</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +<p><cite>Tag</cite> オブジェクトの属性の <a class="reference internal" href="#id15">値が複数のとき</a> を思い出してください。 +それと同様に、あるCSSクラスを検索するときは、複数のCSSクラスに対してマッチさせられます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<p class="body strikeout"></p>'</span><span class="p">)</span> +<span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">"strikeout"</span><span class="p">)</span> +<span class="c"># [<p class="body strikeout"></p>]</span> + +<span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">"body"</span><span class="p">)</span> +<span class="c"># [<p class="body strikeout"></p>]</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">class</span></tt> 属性の値は、文字列としても検索できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">"body strikeout"</span><span class="p">)</span> +<span class="c"># [<p class="body strikeout"></p>]</span> +</pre></div> +</div> +<p>しかし、文字列の値としての変数を検索することはできません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="n">class_</span><span class="o">=</span><span class="s">"strikeout body"</span><span class="p">)</span> +<span class="c"># []</span> +</pre></div> +</div> +<p>もしあなたが2つ以上のクラスをまっちさせたいなら、CSSセレクトを使ってください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">css_soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"p.strikeout.body"</span><span class="p">)</span> +<span class="c"># [<p class="body strikeout"></p>]</span> +</pre></div> +</div> +<p>Beautiful Soupの古いバージョンでは、 <tt class="docutils literal"><span class="pre">class_</span></tt> 引数は使えません。 +そこで、以下に述べる <tt class="docutils literal"><span class="pre">attrs</span></tt> トリックを使うことができます。 +これは”class”をkeyに持つ辞書を <tt class="docutils literal"><span class="pre">attrs</span></tt> 引数に渡して、検索することができます。 +この辞書のvalueには、文字列, 正規表現などが使えます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="n">attrs</span><span class="o">=</span><span class="p">{</span><span class="s">"class"</span><span class="p">:</span> <span class="s">"sister"</span><span class="p">})</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +<span class="target" id="text"></span></div> +<div class="section" id="id33"> +<h3>text引数<a class="headerlink" href="#id33" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">text</span></tt> 引数で、タグに挟まれている文字列を対象に検索することができます。 +<tt class="docutils literal"><span class="pre">name</span></tt> 引数やキーワード引数のように、 <a class="reference internal" href="#id27">文字列</a> , <a class="reference internal" href="#id28">正規表現</a> , <a class="reference internal" href="#id29">リスト</a> , <a class="reference internal" href="#id30">関数</a> , <a class="reference internal" href="#true">True値</a> が使えます。 +以下の例をごらんください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="s">"Elsie"</span><span class="p">)</span> +<span class="c"># [u'Elsie']</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="p">[</span><span class="s">"Tillie"</span><span class="p">,</span> <span class="s">"Elsie"</span><span class="p">,</span> <span class="s">"Lacie"</span><span class="p">])</span> +<span class="c"># [u'Elsie', u'Lacie', u'Tillie']</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">re</span><span class="o">.</span><span class="n">compile</span><span class="p">(</span><span class="s">"Dormouse"</span><span class="p">))</span> +<span class="p">[</span><span class="s">u"The Dormouse's story"</span><span class="p">,</span> <span class="s">u"The Dormouse's story"</span><span class="p">]</span> + +<span class="k">def</span> <span class="nf">is_the_only_string_within_a_tag</span><span class="p">(</span><span class="n">s</span><span class="p">):</span> + <span class="sd">"""Return True if this string is the only child of its parent tag."""</span> + <span class="k">return</span> <span class="p">(</span><span class="n">s</span> <span class="o">==</span> <span class="n">s</span><span class="o">.</span><span class="n">parent</span><span class="o">.</span><span class="n">string</span><span class="p">)</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">is_the_only_string_within_a_tag</span><span class="p">)</span> +<span class="c"># [u"The Dormouse's story", u"The Dormouse's story", u'Elsie', u'Lacie', u'Tillie', u'...']</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">text</span></tt> 引数はテキスト文字列の検索ですが、これにタグの検索を組みわせることもできます。 +Beautiful Soupは、<tt class="docutils literal"><span class="pre">text</span></tt> 引数で指定した文字列を <tt class="docutils literal"><span class="pre">.string</span></tt> にもつタグ全てを見つけます。 +次のコードは、<tt class="docutils literal"><span class="pre">.string</span></tt> に “Elsie”を持つ<a>タグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="s">"Elsie"</span><span class="p">)</span> +<span class="c"># [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]</span> +</pre></div> +</div> +</div> +<div class="section" id="limit"> +<span id="id34"></span><h3>limit引数<a class="headerlink" href="#limit" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドは、指定したフィルターにマッチした全てのタグと文字列を返します。 +これはドキュメントが大きいときは時間がかかります。 +もし、 <strong>全ての</strong> 結果を必要としなければ、<tt class="docutils literal"><span class="pre">limit</span></tt> 引数で取得する数を指定することができます。</p> +<p>“three siters”ドキュメントには3つのリンクがある、しかし以下のコードははじめの2つしか見つけない。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]</span> +</pre></div> +</div> +</div> +<div class="section" id="recursive"> +<span id="id35"></span><h3>recursive引数<a class="headerlink" href="#recursive" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">mytag.find_all()</span></tt> を実行すると、Beautiful Soupは、 <tt class="docutils literal"><span class="pre">mytag</span></tt> の全ての子孫要素を調べます。 +(子要素、子要素の子要素、そのまた子要素というかんじで、、) +もし、直下の子要素しか調べたくなければ、<tt class="docutils literal"><span class="pre">recursive=False</span></tt> という引数を渡せばよいです。 +以下で違いをみてみましょう。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">html</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"title"</span><span class="p">,</span> <span class="n">recursive</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span> +<span class="c"># []</span> +</pre></div> +</div> +<p>これはドキュメントの一部です。:</p> +<div class="highlight-python"><pre><html> + <head> + <title> + The Dormouse's story + </title> + </head> +...</pre> +</div> +<p>このドキュメントにおいて、<title>タグは<html>の下にはあるが、<cite>直下</cite> にあるわけではありません。 +Beautiful Soupが<title>タグを見つけることができるのは、<html>タグ以下の全ての子孫要素を探してよいときだけです。 +もし、<tt class="docutils literal"><span class="pre">find_all()</span></tt> の引数に <tt class="docutils literal"><span class="pre">recurive=False</span></tt> という<html>タグの直下のみを検索するという制限がかかっていたら、<title>タグを見つけることはできません。</p> +<p>Beautiful Soupは、多くのパースツリーを検索するメソッドを提供しています。 +それら多くは共通する引数を持ちます。 +<tt class="docutils literal"><span class="pre">find_all()</span></tt> の <tt class="docutils literal"><span class="pre">name</span></tt>, <tt class="docutils literal"><span class="pre">attrs</span></tt>, <tt class="docutils literal"><span class="pre">text</span></tt>, <tt class="docutils literal"><span class="pre">limit</span></tt>, キーワード引数は、他の多くのメソッドにも対応しています。 +しかし、 <tt class="docutils literal"><span class="pre">recursive</span></tt> 引数は、 <tt class="docutils literal"><span class="pre">find_all()</span></tt>, <tt class="docutils literal"><span class="pre">find()</span></tt> の2つのメソッドしか対応していません。 +<tt class="docutils literal"><span class="pre">find_parents()</span></tt> のようなメソッドに、引数 <tt class="docutils literal"><span class="pre">recursive=False</span></tt> を渡しても意味がありません。</p> +</div> +<div class="section" id="id36"> +<h3>ショートカット<a class="headerlink" href="#id36" title="Permalink to this headline">¶</a></h3> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> はBeautiful Soupの検索APIの中で、一番使われるものなので、ショートカットがあります。 +<tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> オブジェクトや <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトを関数のように扱って、 <tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドを呼び出すことができます。 +以下の2行は等価です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span> +<span class="n">soup</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span> +</pre></div> +</div> +<p>以下の2行もまた等価です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">title</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="find"> +<h2><tt class="docutils literal"><span class="pre">find()</span></tt><a class="headerlink" href="#find" title="Permalink to this headline">¶</a></h2> +<p>使い方: find(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#recursive"><em>recursive</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドは、検索結果を得るためにHTMLドキュメント全部をスキャンします。 +しかし、1つだけの検索結果が必要なときがあります。 +もし、HTMLドキュメントに<body>タグが1つだけなら、HTMLドキュメント全体をスキャンするのは時間の無駄です。 +その場合は <tt class="docutils literal"><span class="pre">find_all()</span></tt> メソッドに <tt class="docutils literal"><span class="pre">limit=1</span></tt> という引数を渡さずに、 <tt class="docutils literal"><span class="pre">find()</span></tt> メソッドを使うことができます。 +以下の2行は、ほぼ等価です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="s">'title'</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="mi">1</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">'title'</span><span class="p">)</span> +<span class="c"># <title>The Dormouse's story</title></span> +</pre></div> +</div> +<p>ただ1つ違う点は、<tt class="docutils literal"><span class="pre">find_all()</span></tt> は要素1のリストを返し、<tt class="docutils literal"><span class="pre">find()</span></tt> は要素をそのまま返すことです。</p> +<p><tt class="docutils literal"><span class="pre">find_all()</span></tt> が何もみつけられないときは空リストを返します。 +<tt class="docutils literal"><span class="pre">find()</span></tt> が何もみつけられないときは、 <tt class="docutils literal"><span class="pre">None</span></tt> を返します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"nosuchtag"</span><span class="p">))</span> +<span class="c"># None</span> +</pre></div> +</div> +<p><a class="reference internal" href="#id18">タグ名で探索</a> で出てきた <tt class="docutils literal"><span class="pre">soup.head.title</span></tt> で探索する方法を覚えていますか? おkれは、<tt class="docutils literal"><span class="pre">find()</span></tt> についても適用できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">head</span><span class="o">.</span><span class="n">title</span> +<span class="c"># <title>The Dormouse's story</title></span> + +<span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"head"</span><span class="p">)</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span> +<span class="c"># <title>The Dormouse's story</title></span> +</pre></div> +</div> +</div> +<div class="section" id="find-parents-find-parent"> +<h2><tt class="docutils literal"><span class="pre">find_parents()</span></tt> / <tt class="docutils literal"><span class="pre">find_parent()</span></tt><a class="headerlink" href="#find-parents-find-parent" title="Permalink to this headline">¶</a></h2> +<p>使い方: find_parents(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>使い方: find_parent(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>ここまで <tt class="docutils literal"><span class="pre">find_all()</span></tt> と <tt class="docutils literal"><span class="pre">find()</span></tt> について述べてきました。 +Beautiful Soup APIにはパースツリーを検索するためのメソッドが、あと10あります。 +しかし、おそれる必要はありません。 +そのうち5つは、<tt class="docutils literal"><span class="pre">find_all()</span></tt> と基本的に同じです。 +そして、のこりの5つは <tt class="docutils literal"><span class="pre">find()</span></tt> と基本的に同じです。 +違いは、ツリーのどの部分を検索対象にするのかという点のみです。</p> +<p>最初に、 <tt class="docutils literal"><span class="pre">find_parents()</span></tt> と <tt class="docutils literal"><span class="pre">find_parent()</span></tt> を見てみましょう。 +<tt class="docutils literal"><span class="pre">find_all()</span></tt> と <tt class="docutils literal"><span class="pre">find()</span></tt> がタグの子孫を見て、ツリーを下りていったことを思い出してください。 +<tt class="docutils literal"><span class="pre">find_parents()</span></tt> と <tt class="docutils literal"><span class="pre">find_parent()</span></tt> は逆です。 +これらはタグや文字列の親をみて、ツリーを’上に’検索していきます。 +以下の”three daughters”ドキュメントの例で、深いレベルにある文字列から検索していく様子を見てください。:</p> +<div class="highlight-python"><pre>a_string = soup.find(text="Lacie") +a_string +# u'Lacie' + +a_string.find_parents("a") +# [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>] + +a_string.find_parent("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="link3">Tillie</a>; +# and they lived at the bottom of a well.</p> + +a_string.find_parents("p", class="title") +# []</pre> +</div> +<p>3つの<a>タグのうちの1つは、検索の起点になる文字列の直接の親要素なので、それが返されました。 +3つの<p>タグのうちの1つは、起点の文字列の直接の親ではありませんが、やはりそれも返されました。 +CSSクラス”title”をもつ<p>タグは、”three daughers”ドキュメント中にはあるのですが、起点の文字列の親要素ではないので、 <tt class="docutils literal"><span class="pre">find_parents()</span></tt> では見つけることができませんでした。</p> +<p><tt class="docutils literal"><span class="pre">find_parent()</span></tt> と <tt class="docutils literal"><span class="pre">find_parents()</span></tt> のつながりはわかったでしょうか。 +<a class="reference internal" href="#parent">.parent</a> と <a class="reference internal" href="#parents">.parents</a> 属性については、以前に述べてあります。 +そのつながりはとても強いです。 +これらの検索メソッドは実際には <tt class="docutils literal"><span class="pre">.parents</span></tt> で、全ての親要素の連なりをイテレートして扱います。 +そして、要素それぞれについてフィルターにマッチするかどうかをチェックします。</p> +</div> +<div class="section" id="find-next-siblings-find-next-sibling"> +<h2><tt class="docutils literal"><span class="pre">find_next_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_next_sibling()</span></tt><a class="headerlink" href="#find-next-siblings-find-next-sibling" title="Permalink to this headline">¶</a></h2> +<p>使い方: find_next_siblings(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>使い方: find_next_sibling(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>これらのメソッドは、後方にある兄弟要素を扱うのに、 <a class="reference internal" href="#sibling-generators"><em>.next_siblings</em></a> を使います。 +<tt class="docutils literal"><span class="pre">find_next_siblings()</span></tt> メソッドはマッチする兄弟要素を全て返し、 <tt class="docutils literal"><span class="pre">find_next_sibling()</span></tt> は最初の一つを返します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">first_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="n">first_link</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> + +<span class="n">first_link</span><span class="o">.</span><span class="n">find_next_siblings</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">first_story_paragraph</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="s">"story"</span><span class="p">)</span> +<span class="n">first_story_paragraph</span><span class="o">.</span><span class="n">find_next_sibling</span><span class="p">(</span><span class="s">"p"</span><span class="p">)</span> +<span class="c"># <p class="story">...</p></span> +</pre></div> +</div> +</div> +<div class="section" id="find-previous-siblings-find-previous-sibling"> +<h2><tt class="docutils literal"><span class="pre">find_previous_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous_sibling()</span></tt><a class="headerlink" href="#find-previous-siblings-find-previous-sibling" title="Permalink to this headline">¶</a></h2> +<p>使い方: find_previous_siblings(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>使い方: find_previous_sibling(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>これらのメソッドは、HTMLドキュメントの前方にあった兄弟要素を扱うのに <a class="reference internal" href="#sibling-generators"><em>.previous_siblings</em></a> を使います。 +<tt class="docutils literal"><span class="pre">find_previous_siblings()</span></tt> メソッドはマッチする兄弟要素を全て返し、 <tt class="docutils literal"><span class="pre">find_previous_sibling()</span></tt> は最初の一つを返します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">last_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="nb">id</span><span class="o">=</span><span class="s">"link3"</span><span class="p">)</span> +<span class="n">last_link</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a></span> + +<span class="n">last_link</span><span class="o">.</span><span class="n">find_previous_siblings</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]</span> + +<span class="n">first_story_paragraph</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s">"p"</span><span class="p">,</span> <span class="s">"story"</span><span class="p">)</span> +<span class="n">first_story_paragraph</span><span class="o">.</span><span class="n">find_previous_sibling</span><span class="p">(</span><span class="s">"p"</span><span class="p">)</span> +<span class="c"># <p class="title"><b>The Dormouse's story</b></p></span> +</pre></div> +</div> +</div> +<div class="section" id="find-all-next-find-next"> +<h2><tt class="docutils literal"><span class="pre">find_all_next()</span></tt> / <tt class="docutils literal"><span class="pre">find_next()</span></tt><a class="headerlink" href="#find-all-next-find-next" title="Permalink to this headline">¶</a></h2> +<p>使い方: find_all_next(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>使い方: find_next(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>これらのメソッドは、HTMLドキュメントのその後にあらわれるタグと文字列の要素全てイテレートして扱うために、 <tt class="docutils literal"><span class="pre">.next_elements</span></tt> メソッドを使います。 +<tt class="docutils literal"><span class="pre">find_all_next()</span></tt> メソッドはマッチするもの全てを返し、 <tt class="docutils literal"><span class="pre">find_next()</span></tt> は最初にマッチしたものを返します。(!要改善):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">first_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="n">first_link</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> + +<span class="n">first_link</span><span class="o">.</span><span class="n">find_all_next</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span> +<span class="c"># [u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',</span> +<span class="c"># u';\nand they lived at the bottom of a well.', u'\n\n', u'...', u'\n']</span> + +<span class="n">first_link</span><span class="o">.</span><span class="n">find_next</span><span class="p">(</span><span class="s">"p"</span><span class="p">)</span> +<span class="c"># <p class="story">...</p></span> +</pre></div> +</div> +<p>最初の例では、起点となった<a>タグに挟まれている、文字列”Elsie”が返されています。 +2番めの例では、起点となった<a>タグと同じパートじゃないにも関わらず、最後の<p>タグが示されています。 +これらのメソッドでは、問題はフィルターにマッチするか否かと、スタートした要素よりも後にでてきたかということが問われます。(!要改善)</p> +</div> +<div class="section" id="find-all-previous-find-previous"> +<h2><tt class="docutils literal"><span class="pre">find_all_previous()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous()</span></tt><a class="headerlink" href="#find-all-previous-find-previous" title="Permalink to this headline">¶</a></h2> +<p>使い方: find_all_previous(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#limit"><em>limit</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>使い方: find_previous(<a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, <a class="reference internal" href="#kwargs"><em>**kwargs</em></a>)</p> +<p>これらのメソッドは、ドキュメントの起点のタグの前にあらわれるタグと文字列の要素全てをイテレートして扱うために、 <a class="reference internal" href="#element-generators"><em>.previous_elements</em></a> メソッドを使います。(!要改善):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">first_link</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="n">first_link</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a></span> + +<span class="n">first_link</span><span class="o">.</span><span class="n">find_all_previous</span><span class="p">(</span><span class="s">"p"</span><span class="p">)</span> +<span class="c"># [<p class="story">Once upon a time there were three little sisters; ...</p>,</span> +<span class="c"># <p class="title"><b>The Dormouse's story</b></p>]</span> + +<span class="n">first_link</span><span class="o">.</span><span class="n">find_previous</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span> +<span class="c"># <title>The Dormouse's story</title></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">find_all_previous("p")</span></tt> は”three sisters”ドキュメントの最初の段落を見つけます。(class=”title”のやつです) +しかし、第2段落でも見つけます。<p>タグは内に起点にした<a>タグを含んでいます。 +驚きすぎないでください。 +我々は、起点のタグより前方に現れた全てのタグを見ているのです。<a>タグを挟んでいる<p>タグは、<a>タグよりも前に示されねばなりません。(!要改善)</p> +</div> +<div class="section" id="id37"> +<h2>CSSセレクタ<a class="headerlink" href="#id37" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soupは、よく使われるCSSセレクタをほとんどサポートしています。 +<tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトや <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトに <tt class="docutils literal"><span class="pre">.select()</span></tt> メソッドで文字列を渡すだけで使えます。</p> +<p>タグを見つけるには次のようにします。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"title"</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"p nth-of-type(3)"</span><span class="p">)</span> +<span class="c"># [<p class="story">...</p>]</span> +</pre></div> +</div> +<p>あるタグより後ろの指定されたタグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"body a"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"html head title"</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> +</pre></div> +</div> +<p>あるタグの直後の指定されたタグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"head > title"</span><span class="p">)</span> +<span class="c"># [<title>The Dormouse's story</title>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"p > a"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"p > a:nth-of-type(2)"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"p > #link1"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"body > a"</span><span class="p">)</span> +<span class="c"># []</span> +</pre></div> +</div> +<p>タグの兄弟要素を見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"#link1 ~ .sister"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"#link1 + .sister"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]</span> +</pre></div> +</div> +<p>CSSクラスによってタグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">".sister"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"[class~=sister]"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +<p>CSSのIDによってタグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"#link1"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">"a#link2"</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]</span> +</pre></div> +</div> +<p>指定の属性の有無でタグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'a[href]'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> +</pre></div> +</div> +<p>属性が持つ値によってタグを見つけます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'a[href="http://example.com/elsie"]'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'a[href^="http://example.com/"]'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,</span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'a[href$="tillie"]'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'a[href*=".com/el"]'</span><span class="p">)</span> +<span class="c"># [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>]</span> +</pre></div> +</div> +<p>languageコードで、マッチさせます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">multilingual_markup</span> <span class="o">=</span> <span class="s">"""</span> +<span class="s"> <p lang="en">Hello</p></span> +<span class="s"> <p lang="en-us">Howdy, y'all</p></span> +<span class="s"> <p lang="en-gb">Pip-pip, old fruit</p></span> +<span class="s"> <p lang="fr">Bonjour mes amis</p></span> +<span class="s">"""</span> +<span class="n">multilingual_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">multilingual_markup</span><span class="p">)</span> +<span class="n">multilingual_soup</span><span class="o">.</span><span class="n">select</span><span class="p">(</span><span class="s">'p[lang|=en]'</span><span class="p">)</span> +<span class="c"># [<p lang="en">Hello</p>,</span> +<span class="c"># <p lang="en-us">Howdy, y'all</p>,</span> +<span class="c"># <p lang="en-gb">Pip-pip, old fruit</p>]</span> +</pre></div> +</div> +<p>このやり方は、CSSセレクタの文法を知っているユーザにとっては、とても便利です。 +これでBeautiful Soup APIの全てのキモを使えるようになりました。 +もしCSSセレクタを使いこなしたいなら、lxmlを使ってみるのもよいでしょう。 +lxmlは処理がとても速く、さらに多くのCSSセレクタをサポートしています。 +しかし、ここではBeautiful Soup APIを使って、シンプルなCSSセレクタの組み合わせるによる方法を説明しました。</p> +</div> +</div> +<div class="section" id="id38"> +<h1>パースツリーを修正<a class="headerlink" href="#id38" title="Permalink to this headline">¶</a></h1> +<p>Beautiful Soupの主な強みは、パースツリーの検索するところにあります。 +しかしまた、Beautiful Soupは、ツリーを修正したり、変更したツリーを新しいHTMLやXMLのドキュメントに出力することもできます。</p> +<div class="section" id="id39"> +<h2>名前や属性の変更<a class="headerlink" href="#id39" title="Permalink to this headline">¶</a></h2> +<p><a class="reference internal" href="#id14">属性</a> の節でも述べましたが、タグの名前変更、属性値の変更、追加、削除ができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<b class="boldest">Extremely bold</b>'</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span> + +<span class="n">tag</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="s">"blockquote"</span> +<span class="n">tag</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> <span class="o">=</span> <span class="s">'verybold'</span> +<span class="n">tag</span><span class="p">[</span><span class="s">'id'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span> +<span class="n">tag</span> +<span class="c"># <blockquote class="verybold" id="1">Extremely bold</blockquote></span> + +<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">'class'</span><span class="p">]</span> +<span class="k">del</span> <span class="n">tag</span><span class="p">[</span><span class="s">'id'</span><span class="p">]</span> +<span class="n">tag</span> +<span class="c"># <blockquote>Extremely bold</blockquote></span> +</pre></div> +</div> +</div> +<div class="section" id="id40"> +<h2><tt class="docutils literal"><span class="pre">.string</span></tt> の修正<a class="headerlink" href="#id40" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">.string</span></tt> を変更すると、そのタグが挟む文字列がその値に変更されます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> + +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="n">tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">"New link text."</span> +<span class="n">tag</span> +<span class="c"># <a href="http://example.com/">New link text.</a></span> +</pre></div> +</div> +<p>注意点: 変更したタグが他のタグを挟んでいると、それらのタグ全てが破壊されます。</p> +</div> +<div class="section" id="append"> +<h2><tt class="docutils literal"><span class="pre">append()</span></tt><a class="headerlink" href="#append" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag.append()</span></tt> により、タグが挟んでいる文字列に追加をすることができます。 +まるでPythonのリストの <tt class="docutils literal"><span class="pre">.append()</span></tt> のように作用します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a>Foo</a>"</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"Bar"</span><span class="p">)</span> + +<span class="n">soup</span> +<span class="c"># <html><head></head><body><a>FooBar</a></body></html></span> +<span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [u'Foo', u'Bar']</span> +</pre></div> +</div> +</div> +<div class="section" id="beautifulsoup-new-string-new-tag"> +<h2><tt class="docutils literal"><span class="pre">BeautifulSoup.new_string()</span></tt> / <tt class="docutils literal"><span class="pre">.new_tag()</span></tt><a class="headerlink" href="#beautifulsoup-new-string-new-tag" title="Permalink to this headline">¶</a></h2> +<p>ドキュメントに文字列を加えたいときは、Pythonの文字列を <tt class="docutils literal"><span class="pre">append()</span></tt> に渡してください。 +もしくは、 <a class="reference external" href="http://ja.wikipedia.org/wiki/Factory_Method_%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3">factory method</a> の <tt class="docutils literal"><span class="pre">BeautifulSoup.new_string()</span></tt> を呼出してください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<b></b>"</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span> +<span class="n">tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s">"Hello"</span><span class="p">)</span> +<span class="n">new_string</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_string</span><span class="p">(</span><span class="s">" there"</span><span class="p">)</span> +<span class="n">tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_string</span><span class="p">)</span> +<span class="n">tag</span> +<span class="c"># <b>Hello there.</b></span> +<span class="n">tag</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [u'Hello', u' there']</span> +</pre></div> +</div> +<p>新しいコメントや 他の <tt class="docutils literal"><span class="pre">NavigableString</span></tt> のサブクラスを生成したいときは、 <tt class="docutils literal"><span class="pre">new_string()</span></tt> の第2引数にそのクラスを渡してください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">Comment</span> +<span class="n">new_comment</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_string</span><span class="p">(</span><span class="s">"Nice to see you."</span><span class="p">,</span> <span class="n">Comment</span><span class="p">)</span> +<span class="n">tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_comment</span><span class="p">)</span> +<span class="n">tag</span> +<span class="c"># <b>Hello there<!--Nice to see you.--></b></span> +<span class="n">tag</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [u'Hello', u' there', u'Nice to see you.']</span> +</pre></div> +</div> +<p>(これはBeautiful Soup 4.2.1 の新機能です)</p> +<p>完全に新しいタグを生成したいときは、factory methodの <tt class="docutils literal"><span class="pre">BeautifulSoup.new_tag()</span></tt> を呼び出してください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<b></b>"</span><span class="p">)</span> +<span class="n">original_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">b</span> + +<span class="n">new_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_tag</span><span class="p">(</span><span class="s">"a"</span><span class="p">,</span> <span class="n">href</span><span class="o">=</span><span class="s">"http://www.example.com"</span><span class="p">)</span> +<span class="n">original_tag</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">new_tag</span><span class="p">)</span> +<span class="n">original_tag</span> +<span class="c"># <b><a href="http://www.example.com"></a></b></span> + +<span class="n">new_tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">"Link text."</span> +<span class="n">original_tag</span> +<span class="c"># <b><a href="http://www.example.com">Link text.</a></b></span> +</pre></div> +</div> +<p>第1引数のタグ名だけは必須です。</p> +</div> +<div class="section" id="insert"> +<h2><tt class="docutils literal"><span class="pre">insert()</span></tt><a class="headerlink" href="#insert" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag.insert()</span></tt> は <tt class="docutils literal"><span class="pre">Tag.append()</span></tt> に似ています。 +違うのは、タグの <tt class="docutils literal"><span class="pre">.contents</span></tt> の最後以外にも、要素を挿入できるという点です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> + +<span class="n">tag</span><span class="o">.</span><span class="n">insert</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"but did not endorse "</span><span class="p">)</span> +<span class="n">tag</span> +<span class="c"># <a href="http://example.com/">I linked to but did not endorse <i>example.com</i></a></span> +<span class="n">tag</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [u'I linked to ', u'but did not endorse', <i>example.com</i>]</span> +</pre></div> +</div> +</div> +<div class="section" id="insert-before-insert-after"> +<h2><tt class="docutils literal"><span class="pre">insert_before()</span></tt> / <tt class="docutils literal"><span class="pre">insert_after()</span></tt><a class="headerlink" href="#insert-before-insert-after" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">insert_before()</span></tt> メソッドは、あるタグの直前に、別のタグや文字列を挿入します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<b>stop</b>"</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_tag</span><span class="p">(</span><span class="s">"i"</span><span class="p">)</span> +<span class="n">tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">"Don't"</span> +<span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">insert_before</span><span class="p">(</span><span class="n">tag</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">b</span> +<span class="c"># <b><i>Don't</i>stop</b></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">insert_after()</span></tt> メソッドは、あるタグの直後に、別のタグや文字列を挿入します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">insert_after</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">new_string</span><span class="p">(</span><span class="s">" ever "</span><span class="p">))</span> +<span class="n">soup</span><span class="o">.</span><span class="n">b</span> +<span class="c"># <b><i>Don't</i> ever stop</b></span> +<span class="n">soup</span><span class="o">.</span><span class="n">b</span><span class="o">.</span><span class="n">contents</span> +<span class="c"># [<i>Don't</i>, u' ever ', u'stop']</span> +</pre></div> +</div> +</div> +<div class="section" id="clear"> +<h2><tt class="docutils literal"><span class="pre">clear()</span></tt><a class="headerlink" href="#clear" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag.clear()</span></tt> は、タグが挟んでいるcontentsを削除します。(訳注:要チェック?):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> + +<span class="n">tag</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span> +<span class="n">tag</span> +<span class="c"># <a href="http://example.com/"></a></span> +</pre></div> +</div> +</div> +<div class="section" id="extract"> +<h2><tt class="docutils literal"><span class="pre">extract()</span></tt><a class="headerlink" href="#extract" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">PageElement.extract()</span></tt> はツリーからタグや文字列を除去します。 +返値は、その抽出されたタグや文字列です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> + +<span class="n">i_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">extract</span><span class="p">()</span> + +<span class="n">a_tag</span> +<span class="c"># <a href="http://example.com/">I linked to</a></span> + +<span class="n">i_tag</span> +<span class="c"># <i>example.com</i></span> + +<span class="k">print</span><span class="p">(</span><span class="n">i_tag</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span> +<span class="bp">None</span> +</pre></div> +</div> +<p>このとき、2つのパースツリーがあります。1つは <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトを根ノードとしたあなたがパースしたドキュメントです。もう1つは、抽出したタグを根ノードとするものです。抽出した要素の子要素を <tt class="docutils literal"><span class="pre">extract</span></tt> でコールできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">my_string</span> <span class="o">=</span> <span class="n">i_tag</span><span class="o">.</span><span class="n">string</span><span class="o">.</span><span class="n">extract</span><span class="p">()</span> +<span class="n">my_string</span> +<span class="c"># u'example.com'</span> + +<span class="k">print</span><span class="p">(</span><span class="n">my_string</span><span class="o">.</span><span class="n">parent</span><span class="p">)</span> +<span class="c"># None</span> +<span class="n">i_tag</span> +<span class="c"># <i></i></span> +</pre></div> +</div> +</div> +<div class="section" id="decompose"> +<h2><tt class="docutils literal"><span class="pre">decompose()</span></tt><a class="headerlink" href="#decompose" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag.decompose()</span></tt> はパースツリーからタグを除去します。 +<strong>そのタグと挟んでいるcontentsを完全に削除します</strong></p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">decompose</span><span class="p">()</span> + +<span class="n">a_tag</span> +<span class="c"># <a href="http://example.com/">I linked to</a></span> +</pre></div> +</div> +</div> +<div class="section" id="replace-with"> +<span id="id41"></span><h2><tt class="docutils literal"><span class="pre">replace_with()</span></tt><a class="headerlink" href="#replace-with" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">PageElement.replace_with()</span></tt> はツリーからタグと文字列を除去し、 +引数に与えたタグや文字をその代わりに置き換えます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> + +<span class="n">new_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">new_tag</span><span class="p">(</span><span class="s">"b"</span><span class="p">)</span> +<span class="n">new_tag</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="s">"example.net"</span> +<span class="n">a_tag</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">replace_with</span><span class="p">(</span><span class="n">new_tag</span><span class="p">)</span> + +<span class="n">a_tag</span> +<span class="c"># <a href="http://example.com/">I linked to <b>example.net</b></a></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">replace_with()</span></tt> は置き換えられたタグや文字列を返します。 +それを、調査したり、ツリーの他の部分に加えることができます。</p> +</div> +<div class="section" id="wrap"> +<h2><tt class="docutils literal"><span class="pre">wrap()</span></tt><a class="headerlink" href="#wrap" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">PageElement.wrap()</span></tt> は、その要素を引数で指定したタグを挟みます。 +新しく挟まれたものを返します。</p> +<div class="highlight-python"><pre>soup = BeautifulSoup("<p>I wish I was bold.</p>") +soup.p.string.wrap(soup.new_tag("b")) +# <b>I wish I was bold.</b> + +soup.p.wrap(soup.new_tag("div") +# <div><p><b>I wish I was bold.</b></p></div></pre> +</div> +<p>このメソッドは、Beautiful Soup 4.0.5 からの新機能です。</p> +</div> +<div class="section" id="unwrap"> +<h2><tt class="docutils literal"><span class="pre">unwrap()</span></tt><a class="headerlink" href="#unwrap" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">Tag.unwrap()</span></tt> は <tt class="docutils literal"><span class="pre">wrap()</span></tt> の反対です。 +それは、タグの中身がなんであれ、それとタグを置き換えます。 +マークアップをはずすのに便利です。(訳注:やりなおし??):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">a_tag</span> <span class="o">=</span> <span class="n">soup</span><span class="o">.</span><span class="n">a</span> + +<span class="n">a_tag</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">unwrap</span><span class="p">()</span> +<span class="n">a_tag</span> +<span class="c"># <a href="http://example.com/">I linked to example.com</a></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">replace_with()</span></tt> のように、 <tt class="docutils literal"><span class="pre">unwrap()</span></tt> は置き換えられたタグを返します。</p> +</div> +</div> +<div class="section" id="id42"> +<h1>出力<a class="headerlink" href="#id42" title="Permalink to this headline">¶</a></h1> +<span class="target" id="prettyprinting"></span><div class="section" id="id43"> +<h2>きれいに出力<a class="headerlink" href="#id43" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">prettify()</span></tt> メソッドは、BeautifulSoupパースツリーを、1行に1タグのきれいにフォーマットされたUnicode文字列に変換します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">()</span> +<span class="c"># '<html>\n <head>\n </head>\n <body>\n <a href="http://example.com/">\n...'</span> + +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <html></span> +<span class="c"># <head></span> +<span class="c"># </head></span> +<span class="c"># <body></span> +<span class="c"># <a href="http://example.com/"></span> +<span class="c"># I linked to</span> +<span class="c"># <i></span> +<span class="c"># example.com</span> +<span class="c"># </i></span> +<span class="c"># </a></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">prettify()</span></tt> メソッドは、 トップレベルの <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトでも、それ以外の <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトでも呼び出すことができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <a href="http://example.com/"></span> +<span class="c"># I linked to</span> +<span class="c"># <i></span> +<span class="c"># example.com</span> +<span class="c"># </i></span> +<span class="c"># </a></span> +</pre></div> +</div> +</div> +<div class="section" id="id44"> +<h2>一行に出力<a class="headerlink" href="#id44" title="Permalink to this headline">¶</a></h2> +<p>フォーマットされたテキストではなく単なる文字列がほしければ、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> や <tt class="docutils literal"><span class="pre">Tag</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">unicode()</span></tt> や <tt class="docutils literal"><span class="pre">str()</span></tt> を呼び出せます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="nb">str</span><span class="p">(</span><span class="n">soup</span><span class="p">)</span> +<span class="c"># '<html><head></head><body><a href="http://example.com/">I linked to <i>example.com</i></a></body></html>'</span> + +<span class="nb">unicode</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="p">)</span> +<span class="c"># u'<a href="http://example.com/">I linked to <i>example.com</i></a>'</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">str()</span></tt> 関数は、UTF-8にエンコードされた文字列を返します。 +他のオプションを知りたければ、 <a class="reference internal" href="#id48">エンコード</a> をみてください。</p> +<p>バイト文字列を得るのに、 <tt class="docutils literal"><span class="pre">encode()</span></tt> を用いることもできます。 +<tt class="docutils literal"><span class="pre">decode()</span></tt> を用いると、Unicodeを得ることができます。</p> +<span class="target" id="output-formatters"></span></div> +<div class="section" id="id45"> +<h2>フォーマットを指定<a class="headerlink" href="#id45" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soupに、”&lquot;”のようなHTMLエンティティを含んだドキュメントを渡すと、それらはUnicodeキャラクタに変換されます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"&ldquo;Dammit!&rdquo; he said."</span><span class="p">)</span> +<span class="nb">unicode</span><span class="p">(</span><span class="n">soup</span><span class="p">)</span> +<span class="c"># u'<html><head></head><body>\u201cDammit!\u201d he said.</body></html>'</span> +</pre></div> +</div> +<p>そのドキュメントを文字列に変換すると、Unicode文字列はUTF-8キャラクタとしてエンコードされます。 +それを、HTMLエンティティに戻すことはできません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="nb">str</span><span class="p">(</span><span class="n">soup</span><span class="p">)</span> +<span class="c"># '<html><head></head><body>\xe2\x80\x9cDammit!\xe2\x80\x9d he said.</body></html>'</span> +</pre></div> +</div> +<p>デフォルトでは、出力するときエスケープされるのは、裸の&と角かっこのみです。 +これらは、”&amp;”,”&lt;”,”&gt”に変換されます。 +そのためBeautifulSoupはうっかり不正確なHTMLやXMLを生成することはありません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<p>The law firm of Dewey, Cheatem, & Howe</p>"</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">p</span> +<span class="c"># <p>The law firm of Dewey, Cheatem, &amp; Howe</p></span> + +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<a href="http://example.com/?foo=val1&bar=val2">A link</a>'</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">a</span> +<span class="c"># <a href="http://example.com/?foo=val1&amp;bar=val2">A link</a></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">prettify()</span></tt>, <tt class="docutils literal"><span class="pre">encode()</span></tt>, <tt class="docutils literal"><span class="pre">decode()</span></tt> の <tt class="docutils literal"><span class="pre">formatter</span></tt> 属性に値を与えると、出力を変更することができます。 +<tt class="docutils literal"><span class="pre">formatter</span></tt> は、4種類の値をとり得ます。</p> +<p>デフォルトでは、 <tt class="docutils literal"><span class="pre">formatter="minimal"</span></tt> です。 +文字列は、Beautiful Soupが正しいHTML/XMLを生成することを十分に保証するように、加工されるだけです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">french</span> <span class="o">=</span> <span class="s">"<p>Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;</p>"</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">french</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s">"minimal"</span><span class="p">))</span> +<span class="c"># <html></span> +<span class="c"># <body></span> +<span class="c"># <p></span> +<span class="c"># Il a dit &lt;&lt;Sacrテゥ bleu!&gt;&gt;</span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p>もし、 <tt class="docutils literal"><span class="pre">formatter="html"</span></tt> を渡せば、BSは 可能なときはいつでも、Unicode文字列を HTMLエンティティに変換します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s">"html"</span><span class="p">))</span> +<span class="c"># <html></span> +<span class="c"># <body></span> +<span class="c"># <p></span> +<span class="c"># Il a dit &lt;&lt;Sacr&eacute; bleu!&gt;&gt;</span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p>もし、 <tt class="docutils literal"><span class="pre">formatter=None</span></tt> を渡せば、BSは出力においてまったく文字列を修正しません。 +これは、最速のオプションですが、BSが正しくないHTML/XMLを生成することになります。 +次の例をご覧ください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="bp">None</span><span class="p">))</span> +<span class="c"># <html></span> +<span class="c"># <body></span> +<span class="c"># <p></span> +<span class="c"># Il a dit <<Sacrテゥ bleu!>></span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> + +<span class="n">link_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">'<a href="http://example.com/?foo=val1&bar=val2">A link</a>'</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">link_soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="bp">None</span><span class="p">))</span> +<span class="c"># <a href="http://example.com/?foo=val1&bar=val2">A link</a></span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">formatter</span></tt> に関数を渡すと、ドキュメントの文字列や属性値のたびに、BSはその関数をコールします。 +関数内で望むことはなんであれできます。 +以下では、formatterは文字列を大文字にコンバートし、他には何もしません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">def</span> <span class="nf">uppercase</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span> + <span class="k">return</span> <span class="nb">str</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span> + +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="n">uppercase</span><span class="p">))</span> +<span class="c"># <html></span> +<span class="c"># <body></span> +<span class="c"># <p></span> +<span class="c"># IL A DIT <<SACRテ BLEU!>></span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> + +<span class="k">print</span><span class="p">(</span><span class="n">link_soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="n">uppercase</span><span class="p">))</span> +<span class="c"># <a href="HTTP://EXAMPLE.COM/?FOO=VAL1&BAR=VAL2"></span> +<span class="c"># A LINK</span> +<span class="c"># </a></span> +</pre></div> +</div> +<p>もしあなたがあなたの関数を書いたなら、あなたは <tt class="docutils literal"><span class="pre">bs4.dammit</span></tt> の <tt class="docutils literal"><span class="pre">EntitySubstitution</span></tt> クラスについて知るべきです。 +このクラスは、BSの標準的なformatter をクラスメソッドとして内包します。 +“html” formatterは <tt class="docutils literal"><span class="pre">EntitySubstitution.substitute_html</span></tt> , +“minimal” formatterは <tt class="docutils literal"><span class="pre">EntitySubstitution.substitute_xml</span></tt> です。 +あなたは、これらの関数を、 <tt class="docutils literal"><span class="pre">formatter==html</span></tt> や <tt class="docutils literal"><span class="pre">formatter==minimal</span></tt> をシュミレーションします。 +しかし、それに加えて他のこともします。</p> +<p>これは例です。UnicodeキャラクタをHTMLエンティティに置換します。可能なときはいつでも。 +しかし、 <strong>また</strong> 全ての文字列を大文字に変換します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4.dammit</span> <span class="kn">import</span> <span class="n">EntitySubstitution</span> +<span class="k">def</span> <span class="nf">uppercase_and_substitute_html_entities</span><span class="p">(</span><span class="nb">str</span><span class="p">):</span> + <span class="k">return</span> <span class="n">EntitySubstitution</span><span class="o">.</span><span class="n">substitute_html</span><span class="p">(</span><span class="nb">str</span><span class="o">.</span><span class="n">upper</span><span class="p">())</span> + +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="n">uppercase_and_substitute_html_entities</span><span class="p">))</span> +<span class="c"># <html></span> +<span class="c"># <body></span> +<span class="c"># <p></span> +<span class="c"># IL A DIT &lt;&lt;SACR&Eacute; BLEU!&gt;&gt;</span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p>最後に一点(最終通告?): もし <tt class="docutils literal"><span class="pre">CData</span></tt> オブジェクトを生成したときは、そのオブジェクト内のテキストは <strong>正確にあるがまま、フォーマットされることなく</strong> いつも表されます。 +BSは formatterメソッドを呼出します。あなたがカスタムメソッドを書いた場合にのみ。どういうカスタムメソッド化というと、全てのドキュメント内の文字列やなにかをcountする。しかし、それは返り値を無視します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4.element</span> <span class="kn">import</span> <span class="n">CData</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a></a>"</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">string</span> <span class="o">=</span> <span class="n">CData</span><span class="p">(</span><span class="s">"one < three"</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">a</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="n">formatter</span><span class="o">=</span><span class="s">"xml"</span><span class="p">))</span> +<span class="c"># <a></span> +<span class="c"># <![CDATA[one < three]]></span> +<span class="c"># </a></span> +</pre></div> +</div> +</div> +<div class="section" id="get-text"> +<h2><tt class="docutils literal"><span class="pre">get_text()</span></tt><a class="headerlink" href="#get-text" title="Permalink to this headline">¶</a></h2> +<p>ドキュメントやタグのテキスト部分だけが取得したいときは、 <tt class="docutils literal"><span class="pre">get_text()</span></tt> メソッドを使います。 +それは、全ドキュメントや下層のタグを、ユニコードの単一文字列として返します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">'<a href="http://example.com/"></span><span class="se">\n</span><span class="s">I linked to <i>example.com</i></span><span class="se">\n</span><span class="s"></a>'</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">get_text</span><span class="p">()</span> +<span class="s">u'</span><span class="se">\n</span><span class="s">I linked to example.com</span><span class="se">\n</span><span class="s">'</span> +<span class="n">soup</span><span class="o">.</span><span class="n">i</span><span class="o">.</span><span class="n">get_text</span><span class="p">()</span> +<span class="s">u'example.com'</span> +</pre></div> +</div> +<p>テキストをまとめる際の区切り文字を指定することができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="c"># soup.get_text("|")</span> +<span class="s">u'</span><span class="se">\n</span><span class="s">I linked to |example.com|</span><span class="se">\n</span><span class="s">'</span> +</pre></div> +</div> +<p>各文字列パーツの最初と最後の空白を除去することもできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="c"># soup.get_text("|", strip=True)</span> +<span class="s">u'I linked to|example.com'</span> +</pre></div> +</div> +<p>空白を除去するのに、 <a class="reference internal" href="#string-generators"><em>stripped_strings</em></a> ジェネレーターを使って処理することもできます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="p">[</span><span class="n">text</span> <span class="k">for</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">soup</span><span class="o">.</span><span class="n">stripped_strings</span><span class="p">]</span> +<span class="c"># [u'I linked to', u'example.com']</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="id46"> +<h1>パーサーの指定<a class="headerlink" href="#id46" title="Permalink to this headline">¶</a></h1> +<p>もし貴方がいくつかのhtmlをパースしたいなら、あなたは、 <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> コンストラクタに、マークアップをダンプできる。 +それはたぶんうまくいきます。 +Beautiful Soupはパーサーを選んで、データをパースします。 +しかし、どのパーサーが使われるか変更するために、コンストラクタに渡すいくつかの引数があります</p> +<p>1つ目の <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタの引数は、 あなたがパースしたいマークアップの、文字列または開いているファイルハンドルです。 +2つ目の引数は、<em>どのように</em> マークアップをぱーすするかについてです。</p> +<p>もし何も指定しなかった場合は、インストールされているなかで最高のHTMLパーサーを使います。 +Beautiful Soupは、lxmlのパーサーを最高のものとしています。そして、html5libとPythonの組み込みパーサー。 +あなたは次のうちの一つを指定することで、これを上書きできます。</p> +<ul class="simple"> +<li>パースしたいマークアップの種類: サポートしているのは、”html”, “xml”, “html5”です。</li> +</ul> +<ul class="simple"> +<li>パーサーライブラリの名前: オプションとしてサポートしているのは、”lxml”, “html5lib”, (Pythonの組み込みHTMLパーサーである) “html.parser”。</li> +</ul> +<p>この <a class="reference internal" href="#id10">パーサーのインストール</a> の章は、サポートしているパーサーを比較します。</p> +<p>もし適切なパーサーをインストールしていないときは、Beautiful Soupはあなたのリクエストを無視し、違うパーサーを選びます。 +現在、ただ一つサポートされているXMLパーサーは、lxmlです。 +もし、lxmlをインストールしてないとき、XMLの要求はあなたに何も与えませんし、”lxml”へのリクエストも動きません。(要改善!)</p> +<div class="section" id="id47"> +<h2>パーサーの違い<a class="headerlink" href="#id47" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soupは多くの異なるパーサーに同じインターフェースを提供しています。 +しかし、パーサーはそれぞれは異なります。 +パーサーが異なると、同じドキュメントでも、生成されるパースツリーは異なってきます。 +HTMLパーサーとXMLパーサーには大きな違いがあります。 +以下は、短いドキュメントをHTMLとしてパースしたものです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a><b /></a>"</span><span class="p">)</span> +<span class="c"># <html><head></head><body><a><b></b></a></body></html></span> +</pre></div> +</div> +<p>空の<b />タグは、正式なHTMLではないため、パーサーはそれを<b></b>のタグの組に変換します。</p> +<p>以下は、同じドキュメントをXMLとしてパースしたものです。 +(これを実行するにはlxmlをインストールしておく必要があります) +<b />タグはそのまま残っており、ドキュメントはXML宣言が<html>タグの代わりに加えられたことに気づいてください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a><b /></a>"</span><span class="p">,</span> <span class="s">"xml"</span><span class="p">)</span> +<span class="c"># <?xml version="1.0" encoding="utf-8"?></span> +<span class="c"># <a><b/></a></span> +</pre></div> +</div> +<p>HTMLパーサー同士でも、違いはあります。 +完全な形のHTMLドキュメントをBeautiful Soupに与えたときは、その違いは問題になりません。 +あるパーサーは、他のパーサーよりも速いでしょう。 +しかし、それらは全て元のHTMLドキュメントを正確に反映したデータ構造を与えるでしょう。</p> +<p>しかし、不完全な形のHTMLドキュメントのときは、異なるパーサーは異なる結果を出力します。 +以下は、lxmlのHTMLパーサーによってパースされた短く不正なドキュメントです。 +ぶらさがっている</p>タグは、単に無視されていることに気づいてください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a></p>"</span><span class="p">,</span> <span class="s">"lxml"</span><span class="p">)</span> +<span class="c"># <html><body><a></a></body></html></span> +</pre></div> +</div> +<p>以下は、html5libによってパースされた同じドキュメントです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a></p>"</span><span class="p">,</span> <span class="s">"html5lib"</span><span class="p">)</span> +<span class="c"># <html><head></head><body><a><p></p></a></body></html></span> +</pre></div> +</div> +<p>ぶらさがっている</p>タグを無視する代わりに、html5libは、それを開始の<p>タグと組にしました。 +このパーサーはまた、ドキュメントに空の<head>タグも加えました。</p> +<p>以下は、Python組み込みのHTMLパーサーで同じドキュメントをパースしたものです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">BeautifulSoup</span><span class="p">(</span><span class="s">"<a></p>"</span><span class="p">,</span> <span class="s">"html.parser"</span><span class="p">)</span> +<span class="c"># <a></a></span> +</pre></div> +</div> +<p>html5libのように、このパーサーは終わりの</p>タグを無視します。 +html5libとは違い、このパーサーは<body>タグを加えて正しい書式のHTMLドキュメントを作成しようとはしません。 +lxmlとは違い、なんとかして<html>タグを加えようとはしません。</p> +<p>“<a></p>”というドキュメントは不正なので、これについての”正しい”処理方法はありません。 +html5libパーサーはhtml5標準のいち部分のテクニックを使います。 +それは、ただしい主張を正しい方法についてします。しかし、これらの3つの方法全て、道理に合っています。(?あとで再チェック)</p> +<p>パーサー間の違いは、あなたのスクリプトにも影響するでしょう。 +もし、スクリプトを他の人に配布したり、複数の計算機で実行しようとするならば、 <tt class="docutils literal"><span class="pre">Beautiful</span> <span class="pre">Soup</span></tt> コンストラクタについてパーサーを指定するべきです。 +そうすることによって、あなたがパースした方法と違うやりかたでドキュメントをパースする可能性を減らすでしょう。</p> +</div> +</div> +<div class="section" id="id48"> +<h1>エンコード<a class="headerlink" href="#id48" title="Permalink to this headline">¶</a></h1> +<p>HTMLやXMLドキュメントは全て、ASCIIやUTF-8のような特定の文字コードで書かれています。 +しかし、BeautifulSoupにドキュメントをロードすると、それらはUnicode型に変換されます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">"<h1>Sacr</span><span class="se">\xc3\xa9</span><span class="s"> bleu!</h1>"</span> +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">h1</span> +<span class="c"># <h1>Sacré bleu!</h1></span> +<span class="n">soup</span><span class="o">.</span><span class="n">h1</span><span class="o">.</span><span class="n">string</span> +<span class="c"># u'Sacr\xe9 bleu!'</span> +</pre></div> +</div> +<p>これは魔法ではありません。Beautiful Soupは <a class="reference internal" href="#unicode-dammit">Unicode, Dammit</a> を内部でライブラリとして呼び出し、文字コードを判別してUnicodeに変換するのに使っています。 +自動判別された文字コードは、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトの <tt class="docutils literal"><span class="pre">.original_encoding</span></tt> 属性で参照することができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">original_encoding</span> +<span class="s">'utf-8'</span> +</pre></div> +</div> +<p>Unicode, Dammit はほとんどの場合正しく判別しますが、たまに失敗します。 +たいてい適切に判別しますが、バイト毎の検索の場合は、とてもながい時間がかかります。 +もし、ドキュメントの文字コードが分かっているのなら、失敗や遅延を避けるために、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタに <tt class="docutils literal"><span class="pre">from_encoding</span></tt> として渡すとよいです。</p> +<p>次の例は、ISO-8859-8(訳注:ラテン文字等の文字コード)で書かれたドキュメントです。 +このドキュメントは短いために、Unicode, Dammitはそれが何か判別できず、それをISO-8859-7(訳注:ギリシア文字等の文字コード)と誤認します。:</p> +<div class="highlight-python"><pre>markup = b"<h1>\xed\xe5\xec\xf9</h1>" +soup = BeautifulSoup(markup) +soup.h1 +<h1>νεμω</h1> +soup.original_encoding +'ISO-8859-7'</pre> +</div> +<p>正しい <tt class="docutils literal"><span class="pre">from_encoding</span></tt> を渡すことで、これを正すことができます。:</p> +<div class="highlight-python"><pre>soup = BeautifulSoup(markup, from_encoding="iso-8859-8") +soup.h1 +<h1>ם ו ל ש</h1> +soup.original_encoding +'iso8859-8'</pre> +</div> +<p>(通常、UTF-8のドキュメントは複数の文字コードを含むことができますが、) ごくまれに、変換できない文字をユニコードの特殊文字”REPLACEMENT CHARACTER” (U+FFFD,�) に置き換えることがあります。 +Unicode, Dammit がこれを行うときは、同時に、 <tt class="docutils literal"><span class="pre">UnicodeDammit</span></tt> か <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトの .contains_replacement_characters 属性にTrueをセットします。 +これにより、変換後のユニコードの文字列は、元の文字コードの文字列を正確に表現しておらず、いくつかのデータが損なわれているということがわかります。 +もし、 <tt class="docutils literal"><span class="pre">.contains_replacement_characters</span></tt> が <tt class="docutils literal"><span class="pre">False</span></tt> のときは、ドキュメント内に特殊文字�があっても、それは(この段落の�のように)もともとあり、データは損なわれていないということです。</p> +<div class="section" id="id49"> +<h2>出力のエンコード<a class="headerlink" href="#id49" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soupでドキュメントを出力すると、元のドキュメントがUTF-8でなくても、UTF-8で出力されます。 +次の例は、Latin-1で書かれたドキュメントについてです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="n">b</span><span class="s">'''</span> +<span class="s"> <html></span> +<span class="s"> <head></span> +<span class="s"> <meta content="text/html; charset=ISO-Latin-1" http-equiv="Content-type" /></span> +<span class="s"> </head></span> +<span class="s"> <body></span> +<span class="s"> <p>Sacr</span><span class="se">\xe9</span><span class="s"> bleu!</p></span> +<span class="s"> </body></span> +<span class="s"> </html></span> +<span class="s">'''</span> + +<span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <html></span> +<span class="c"># <head></span> +<span class="c"># <meta content="text/html; charset=utf-8" http-equiv="Content-type" /></span> +<span class="c"># </head></span> +<span class="c"># <body></span> +<span class="c"># <p></span> +<span class="c"># Sacrテゥ bleu!</span> +<span class="c"># </p></span> +<span class="c"># </body></span> +<span class="c"># </html></span> +</pre></div> +</div> +<p><meta>タグは書き換えられ、ドキュメントが現在UTF-8であることを示しています。:</p> +<div class="highlight-python"><pre>.. If you don't want UTF-8, you can pass an encoding into ``prettify()``::</pre> +</div> +<p>UTF-8以外で出力したいときは、 <tt class="docutils literal"><span class="pre">prettify()</span></tt> にその文字コードを渡してください。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">soup</span><span class="o">.</span><span class="n">prettify</span><span class="p">(</span><span class="s">"latin-1"</span><span class="p">))</span> +<span class="c"># <html></span> +<span class="c"># <head></span> +<span class="c"># <meta content="text/html; charset=latin-1" http-equiv="Content-type" /></span> +<span class="c"># ...</span> +</pre></div> +</div> +<p>Pythonのstr型であるかのように、<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> オブジェクトや、その要素のencode()をコールすることができます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span><span class="o">.</span><span class="n">p</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"latin-1"</span><span class="p">)</span> +<span class="c"># '<p>Sacr\xe9 bleu!</p>'</span> + +<span class="n">soup</span><span class="o">.</span><span class="n">p</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf-8"</span><span class="p">)</span> +<span class="c"># '<p>Sacr\xc3\xa9 bleu!</p>'</span> +</pre></div> +</div> +<p>あなたが選んだ文字コードでは表せない文字は、XMLエンティティリファレンスの数字に変換されます。 +次の例は、スノーマンのユニコード文字を含んだドキュメントです。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="s">u"<b></span><span class="se">\N{SNOWMAN}</span><span class="s"></b>"</span> +<span class="n">snowman_soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">)</span> +<span class="n">tag</span> <span class="o">=</span> <span class="n">snowman_soup</span><span class="o">.</span><span class="n">b</span> +</pre></div> +</div> +<p>スノーマンの文字はUTF-8のドキュメントに組み込めます。(それは☃と表示されます。しかし、ISO-Latin-1やASCIIにはその文字がありません。そこで、これらの文字コードでは”&#9731”に変換されます。):</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">tag</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf-8"</span><span class="p">))</span> +<span class="c"># <b>☃</b></span> + +<span class="k">print</span> <span class="n">tag</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"latin-1"</span><span class="p">)</span> +<span class="c"># <b>&#9731;</b></span> + +<span class="k">print</span> <span class="n">tag</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"ascii"</span><span class="p">)</span> +<span class="c"># <b>&#9731;</b></span> +</pre></div> +</div> +</div> +<div class="section" id="unicode-dammit"> +<h2>Unicode, Dammit<a class="headerlink" href="#unicode-dammit" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soup 抜きで、Unicode, Dammitを使えます。 +文字コードがわからないデータを持つときや、Unicodeにそのデータを変換したいときは、それは便利です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">UnicodeDammit</span> +<span class="n">dammit</span> <span class="o">=</span> <span class="n">UnicodeDammit</span><span class="p">(</span><span class="s">"Sacr</span><span class="se">\xc3\xa9</span><span class="s"> bleu!"</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">dammit</span><span class="o">.</span><span class="n">unicode_markup</span><span class="p">)</span> +<span class="c"># Sacré bleu!</span> +<span class="n">dammit</span><span class="o">.</span><span class="n">original_encoding</span> +<span class="c"># 'utf-8'</span> +</pre></div> +</div> +<p>Pythonライブラリ <tt class="docutils literal"><span class="pre">chardet</span></tt> か <tt class="docutils literal"><span class="pre">cchardet</span></tt> をインストールしていれば、Unicode, Dammitはさらに正確に文字コードを推測できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">dammit</span> <span class="o">=</span> <span class="n">UnicodeDammit</span><span class="p">(</span><span class="s">"Sacr</span><span class="se">\xe9</span><span class="s"> bleu!"</span><span class="p">,</span> <span class="p">[</span><span class="s">"latin-1"</span><span class="p">,</span> <span class="s">"iso-8859-1"</span><span class="p">])</span> +<span class="k">print</span><span class="p">(</span><span class="n">dammit</span><span class="o">.</span><span class="n">unicode_markup</span><span class="p">)</span> +<span class="c"># Sacré bleu!</span> +<span class="n">dammit</span><span class="o">.</span><span class="n">original_encoding</span> +<span class="c"># 'latin-1'</span> +</pre></div> +</div> +<p>Unicode, Dammitには、Beautiful Soupが使わない2つの機能があります。</p> +<div class="section" id="id50"> +<h3>スマート引用符<a class="headerlink" href="#id50" title="Permalink to this headline">¶</a></h3> +<p>(訳注: スマート引用符とは、引用符’で左右の向き(open/close)が区別されているもののことです。 +ASCIIコードやシフトJISの引用符は区別されていません。 +[ <a class="reference external" href="http://www.nikkeibp.co.jp/article/nba/20100517/226165/">参考リンク</a> ])</p> +<p>Unicode, Dammitは Microsoftスマート引用符を、HTMLやXMLのエンティティに変換します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">markup</span> <span class="o">=</span> <span class="n">b</span><span class="s">"<p>I just </span><span class="se">\x93</span><span class="s">love</span><span class="se">\x94</span><span class="s"> Microsoft Word</span><span class="se">\x92</span><span class="s">s smart quotes</p>"</span> + +<span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">"windows-1252"</span><span class="p">],</span> <span class="n">smart_quotes_to</span><span class="o">=</span><span class="s">"html"</span><span class="p">)</span><span class="o">.</span><span class="n">unicode_markup</span> +<span class="c"># u'<p>I just &ldquo;love&rdquo; Microsoft Word&rsquo;s smart quotes</p>'</span> + +<span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">"windows-1252"</span><span class="p">],</span> <span class="n">smart_quotes_to</span><span class="o">=</span><span class="s">"xml"</span><span class="p">)</span><span class="o">.</span><span class="n">unicode_markup</span> +<span class="c"># u'<p>I just &#x201C;love&#x201D; Microsoft Word&#x2019;s smart quotes</p>'</span> +</pre></div> +</div> +<p>Microsoftスマート引用符をASCII引用符に変換できます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">"windows-1252"</span><span class="p">],</span> <span class="n">smart_quotes_to</span><span class="o">=</span><span class="s">"ascii"</span><span class="p">)</span><span class="o">.</span><span class="n">unicode_markup</span> +<span class="c"># u'<p>I just "love" Microsoft Word\'s smart quotes</p>'</span> +</pre></div> +</div> +<p>できればこの機能を便利に使ってほしいですが、Beautiful Soupはそれを使いません。 +Beautiful Soupは、他の文字と同じように、Microsoftスマート引用符をUnicodeキャラクタに変換するという、デフォルトの振るまいを選びます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">UnicodeDammit</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="p">[</span><span class="s">"windows-1252"</span><span class="p">])</span><span class="o">.</span><span class="n">unicode_markup</span> +<span class="c"># u'<p>I just \u201clove\u201d Microsoft Word\u2019s smart quotes</p>'</span> +</pre></div> +</div> +</div> +<div class="section" id="id52"> +<h3>複数の文字コード<a class="headerlink" href="#id52" title="Permalink to this headline">¶</a></h3> +<p>ときどき、ほぼUTF-8で書かれているが、一部Microsoftスマート引用符のような文字コードがWindows-1252の文字を含むドキュメントがあります。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">snowmen</span> <span class="o">=</span> <span class="p">(</span><span class="s">u"</span><span class="se">\N{SNOWMAN}</span><span class="s">"</span> <span class="o">*</span> <span class="mi">3</span><span class="p">)</span> +<span class="n">quote</span> <span class="o">=</span> <span class="p">(</span><span class="s">u"</span><span class="se">\N{LEFT DOUBLE QUOTATION MARK}</span><span class="s">I like snowmen!</span><span class="se">\N{RIGHT DOUBLE QUOTATION MARK}</span><span class="s">"</span><span class="p">)</span> +<span class="n">doc</span> <span class="o">=</span> <span class="n">snowmen</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"utf8"</span><span class="p">)</span> <span class="o">+</span> <span class="n">quote</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">"windows_1252"</span><span class="p">)</span> +</pre></div> +</div> +<p>このドキュメントは扱いに困ります。 +スノーマンはUTF-8ですが、スマート引用符はWindows-1252です。 +スノーマンか引用符のどちらかしか表示できません。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">print</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span> +<span class="c"># ☃☃☃�I like snowmen!�</span> + +<span class="k">print</span><span class="p">(</span><span class="n">doc</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">"windows-1252"</span><span class="p">))</span> +<span class="c"># ☃☃☃“I like snowmen!”</span> +</pre></div> +</div> +<p>ドキュメントをUTF-8としてデコードすると、 <tt class="docutils literal"><span class="pre">UnicodeDecodeError</span></tt> が発生し、Windows-1252でデコードすると意味不明(gibberish?)なことになります。 +幸いなことに、 <tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> はその文字をpure UTF-8に変換し、それをUnicodeにデコードし、スノーマンと引用符を並べて表示することを許可します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">new_doc</span> <span class="o">=</span> <span class="n">UnicodeDammit</span><span class="o">.</span><span class="n">detwingle</span><span class="p">(</span><span class="n">doc</span><span class="p">)</span> +<span class="k">print</span><span class="p">(</span><span class="n">new_doc</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s">"utf8"</span><span class="p">))</span> +<span class="c"># ☃☃☃“I like snowmen!”</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> UTF-8に埋め込まれたWindows-1252の文字を扱う方法(とその逆)のみを知っています。しかしこれは、よくあるケースではありません。</p> +<p>データを <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> や <tt class="docutils literal"><span class="pre">UnicodeDammit</span></tt> コンストラクタに渡す前に、 <tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> をコールしなければならないことに注意してください。 +Beautiful Soupは 何らかの単一の文字コードでドキュメントが記されていると想定しています。 +もし、UTF-8とWindows-1252の両方を含むドキュメントを渡したら、ドキュメント全体がWindows-1252と判断しがちです。そして、そしてそのドキュメントの出力は、 ` テ「ヒ愴津「ヒ愴津「ヒ愴停廬 like snowmen!窶拜` のようになります。</p> +<p><tt class="docutils literal"><span class="pre">UnicodeDammit.detwingle()</span></tt> はBeautiful Soup 4.1.0からの機能です。</p> +</div> +</div> +</div> +<div class="section" id="id53"> +<h1>ドキュメントの一部をパース<a class="headerlink" href="#id53" title="Permalink to this headline">¶</a></h1> +<p>あるドキュメントの<a>タグに対してBeautiful Soupを使いたい場合、ドキュメント全部をパースして、その中から<a>タグを探すのは、時間とメモリの無駄です。 +最初にでてくる<a>タグ以外を全て無視すれば、処理は速くなります。 +<tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> クラスは、与えられたドキュメントのどの部分をパースするかを選ぶことができます。 +そのためには、 <tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> を作成し、それを <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタに <tt class="docutils literal"><span class="pre">parse_only</span></tt> 属性として渡すだけです。</p> +<p>(この機能はhtml5libパーサーを使っているときは、使えないことにご注意ください。 +もしhtml5libを使うときはどんなときでも、ドキュメント全体がパースされます。 +これは、html5libがパースツリーをそのように継続的に再構築するためです。 +もし、ドキュメントの一部がパースツリーに組み込まれてない場合は、それは裏ッシュします。 +それをさけるためには、例において、Beautiful SoupがPythonの組み込みパーサーを利用させてください)</p> +<div class="section" id="soupstrainer"> +<h2><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt><a class="headerlink" href="#soupstrainer" title="Permalink to this headline">¶</a></h2> +<p><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> (スープ漉し器)クラスは、 <a class="reference internal" href="#id25">パースツリーを検索</a>: するときの典型的なメソッドである <a class="reference internal" href="#name"><em>name</em></a>, <a class="reference internal" href="#attrs"><em>attrs</em></a>, <a class="reference internal" href="#text"><em>text</em></a>, and <a class="reference internal" href="#kwargs"><em>**kwargs</em></a> をもちます。 +以下は、 <tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> オブジェクトの3通りの例です。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">SoupStrainer</span> + +<span class="n">only_a_tags</span> <span class="o">=</span> <span class="n">SoupStrainer</span><span class="p">(</span><span class="s">"a"</span><span class="p">)</span> + +<span class="n">only_tags_with_id_link2</span> <span class="o">=</span> <span class="n">SoupStrainer</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="s">"link2"</span><span class="p">)</span> + +<span class="k">def</span> <span class="nf">is_short_string</span><span class="p">(</span><span class="n">string</span><span class="p">):</span> + <span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">string</span><span class="p">)</span> <span class="o"><</span> <span class="mi">10</span> + +<span class="n">only_short_strings</span> <span class="o">=</span> <span class="n">SoupStrainer</span><span class="p">(</span><span class="n">text</span><span class="o">=</span><span class="n">is_short_string</span><span class="p">)</span> +</pre></div> +</div> +<p>ここで、”three sisters”ドキュメントをもう一回とりあげます。 +ドキュメントを <tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> オブジェクトで3通りにパースするので、どうなるかを見てみましょう。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">html_doc</span> <span class="o">=</span> <span class="s">"""</span> +<span class="s"><html><head><title>The Dormouse's story</title></head></span> + +<span class="s"><p class="title"><b>The Dormouse's story</b></p></span> + +<span class="s"><p class="story">Once upon a time there were three little sisters; and their names were</span> +<span class="s"><a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,</span> +<span class="s"><a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and</span> +<span class="s"><a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;</span> +<span class="s">and they lived at the bottom of a well.</p></span> + +<span class="s"><p class="story">...</p></span> +<span class="s">"""</span> + +<span class="k">print</span><span class="p">(</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">,</span> <span class="s">"html.parser"</span><span class="p">,</span> <span class="n">parse_only</span><span class="o">=</span><span class="n">only_a_tags</span><span class="p">)</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <a class="sister" href="http://example.com/elsie" id="link1"></span> +<span class="c"># Elsie</span> +<span class="c"># </a></span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2"></span> +<span class="c"># Lacie</span> +<span class="c"># </a></span> +<span class="c"># <a class="sister" href="http://example.com/tillie" id="link3"></span> +<span class="c"># Tillie</span> +<span class="c"># </a></span> + +<span class="k">print</span><span class="p">(</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">,</span> <span class="s">"html.parser"</span><span class="p">,</span> <span class="n">parse_only</span><span class="o">=</span><span class="n">only_tags_with_id_link2</span><span class="p">)</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># <a class="sister" href="http://example.com/lacie" id="link2"></span> +<span class="c"># Lacie</span> +<span class="c"># </a></span> + +<span class="k">print</span><span class="p">(</span><span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">,</span> <span class="s">"html.parser"</span><span class="p">,</span> <span class="n">parse_only</span><span class="o">=</span><span class="n">only_short_strings</span><span class="p">)</span><span class="o">.</span><span class="n">prettify</span><span class="p">())</span> +<span class="c"># Elsie</span> +<span class="c"># ,</span> +<span class="c"># Lacie</span> +<span class="c"># and</span> +<span class="c"># Tillie</span> +<span class="c"># ...</span> +<span class="c">#</span> +</pre></div> +</div> +<p><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt> <a class="reference internal" href="#id25">パースツリーを検索</a> のメソッドに渡すことができます。 +これは、とても便利です。少しだけ説明します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">html_doc</span><span class="p">)</span> +<span class="n">soup</span><span class="o">.</span><span class="n">find_all</span><span class="p">(</span><span class="n">only_short_strings</span><span class="p">)</span> +<span class="c"># [u'\n\n', u'\n\n', u'Elsie', u',\n', u'Lacie', u' and\n', u'Tillie',</span> +<span class="c"># u'\n\n', u'...', u'\n']</span> +</pre></div> +</div> +</div> +</div> +<div class="section" id="id54"> +<h1>トラブルシューティング<a class="headerlink" href="#id54" title="Permalink to this headline">¶</a></h1> +<div class="section" id="diagnose"> +<span id="id55"></span><h2><tt class="docutils literal"><span class="pre">diagnose()</span></tt><a class="headerlink" href="#diagnose" title="Permalink to this headline">¶</a></h2> +<p>もし、Beautiful Soupがドキュメントに何かをしてトラブルになっているときは、どのドキュメントを <tt class="docutils literal"><span class="pre">diagnose()</span></tt> 関数に渡してみてください。(これはBeautiful Soup 4.2.0の新機能です) +Beautiful Soupは、どのようにパーサーがそのドキュメントを扱ったかというレポートを出力し、BeautifulSoupが使っているパーサーが失っているかどうかを教えてくれます。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4.diagnose</span> <span class="kn">import</span> <span class="n">diagnose</span> +<span class="n">data</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s">"bad.html"</span><span class="p">)</span><span class="o">.</span><span class="n">read</span><span class="p">()</span> +<span class="n">diagnose</span><span class="p">(</span><span class="n">data</span><span class="p">)</span> + +<span class="c"># Diagnostic running on Beautiful Soup 4.2.0</span> +<span class="c"># Python version 2.7.3 (default, Aug 1 2012, 05:16:07)</span> +<span class="c"># I noticed that html5lib is not installed. Installing it may help.</span> +<span class="c"># Found lxml version 2.3.2.0</span> +<span class="c">#</span> +<span class="c"># Trying to parse your data with html.parser</span> +<span class="c"># Here's what html.parser did with the document:</span> +<span class="c"># ...</span> +</pre></div> +</div> +<p>diagnose()の出力をみてみると、どのように問題を解決すればよいかわかるでしょう。もし、わからなくても、助けをもとめるときに、 <tt class="docutils literal"><span class="pre">diagnose()</span></tt> の出力を貼り付けることができます。</p> +</div> +<div class="section" id="id56"> +<h2>パース時に出るエラー<a class="headerlink" href="#id56" title="Permalink to this headline">¶</a></h2> +<p>パースエラーには2種類あります。 +1つは、クラッシュです。Beautifuls Soupにドキュメントを読み込ませたときに、例外が発生します。たいていそれは <tt class="docutils literal"><span class="pre">HTMLParser.HTMPParserError</span></tt> です。 +もう1つは、想定外の動作です。Beautiful Soupのパースツリーが、元のドキュメントのパースツリーとかなり違うことがあります。</p> +<p>これらのエラーは、たいていBeautiful Soupが原因ではありません。そのように言えるのは、Beautiful Soupがよくできたソフトウェアだからではなく、Beautiful Soupがパース処理のコードを含んでいないためです。 +代わりに、Beautiful Soupは外部のパーサーに頼っています。もしあるパーサーが正しいドキュメントをパースできないときは、他のパーサーを試してみるというのが一番良い対処です。 +<a class="reference internal" href="#id10">パーサーのインストール</a> に、これについての詳細とパーサーの比較が載っています。</p> +<p>一番よくみるパースエラーは、 <tt class="docutils literal"><span class="pre">HTMLParser.HTMLParseError:</span> <span class="pre">malformed</span> <span class="pre">start</span> <span class="pre">tag</span></tt> と +<tt class="docutils literal"><span class="pre">HTMLParser.HTMLPraseError:</span> <span class="pre">bad</span> <span class="pre">end</span> <span class="pre">tag</span></tt> でしょう。 +これらはともに、Python組み込みのHTMLパーサーライブラリが返します。 +この場合は、 <a class="reference internal" href="#parser-installation"><em>lxml か html5lib をインストール</em></a> するとよいです。</p> +<p>想定外の動作のエラーで最も多いのは、あると思っていたタグを見つけられないときです。 +見たことあると思いますが、そのとき <tt class="docutils literal"><span class="pre">find_all()</span></tt> は <tt class="docutils literal"><span class="pre">[]</span></tt> を返し、 <tt class="docutils literal"><span class="pre">find()</span></tt> は <tt class="docutils literal"><span class="pre">None</span></tt> を返します。 +これも、Python組み込みHTMLパーサーにとっては、よくある問題です。やはり、一番よい対処は、 <a class="reference internal" href="#parser-installation"><em>lxml か html5lib をインストール</em></a> することです。</p> +</div> +<div class="section" id="id57"> +<h2>バージョン違いの問題<a class="headerlink" href="#id57" title="Permalink to this headline">¶</a></h2> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">SyntaxError:</span> <span class="pre">Invalid</span> <span class="pre">syntax</span></tt> (on the line <tt class="docutils literal"><span class="pre">ROOT_TAG_NAME</span> <span class="pre">=</span> +<span class="pre">u'[document]'</span></tt>): Python 2バージョンのBeautiful Soupを、変換しないでPython 3で実行したためです。</li> +</ul> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">HTMLParser</span></tt> - Python 2バージョンのBeautiful Soupを、Python 3で実行したためです。</li> +</ul> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">html.parser</span></tt> - Python 3バージョンのBeautiful Soupを、Python 2で実行したためです。</li> +</ul> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">BeautifulSoup</span></tt> - Beautiful Soup 3のコードを、BS3がインストールされてない環境で実行したため、またはBeautiful Soup 4のコードをパッケージ名を <tt class="docutils literal"><span class="pre">bs4</span></tt> に変えずに実行したためです。</li> +</ul> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">ImportError:</span> <span class="pre">No</span> <span class="pre">module</span> <span class="pre">named</span> <span class="pre">bs4</span></tt> - Beautiful Soup 4のコードを、BS4がインストールされてない環境で実行したためです。</li> +</ul> +<span class="target" id="parsing-xml"></span></div> +<div class="section" id="xml"> +<h2>XMLのパース<a class="headerlink" href="#xml" title="Permalink to this headline">¶</a></h2> +<p>デフォルトでは、Beautiful SoupはドキュメントをHTMLとしてパースします。XMLとしてパースするには、 <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> コンストラクタの第二引数に、 “xml” を渡します。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="n">soup</span> <span class="o">=</span> <span class="n">BeautifulSoup</span><span class="p">(</span><span class="n">markup</span><span class="p">,</span> <span class="s">"xml"</span><span class="p">)</span> +</pre></div> +</div> +<p>このためには、 <a class="reference internal" href="#parser-installation"><em>lxml をインストール</em></a> している必要があります。</p> +</div> +<div class="section" id="id58"> +<h2>その他のパーサーの問題<a class="headerlink" href="#id58" title="Permalink to this headline">¶</a></h2> +<ul class="simple"> +<li>If your script works on one computer but not another, it’s probably +because the two computers have different parser libraries +available. For example, you may have developed the script on a +computer that has lxml installed, and then tried to run it on a +computer that only has html5lib installed. See <a class="reference internal" href="#id47">パーサーの違い</a> +for why this matters, and fix the problem by mentioning a +specific parser library in the <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor.</li> +<li>Because <a class="reference external" href="http://www.w3.org/TR/html5/syntax.html#syntax">HTML tags and attributes are case-insensitive</a>, all three HTML +parsers convert tag and attribute names to lowercase. That is, the +markup <TAG></TAG> is converted to <tag></tag>. If you want to +preserve mixed-case or uppercase tags and attributes, you’ll need to +<a class="reference internal" href="#parsing-xml"><em>parse the document as XML.</em></a></li> +</ul> +</div> +<div class="section" id="misc"> +<span id="id59"></span><h2>その他<a class="headerlink" href="#misc" title="Permalink to this headline">¶</a></h2> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">UnicodeEncodeError:</span> <span class="pre">'charmap'</span> <span class="pre">codec</span> <span class="pre">can't</span> <span class="pre">encode</span> <span class="pre">character</span> +<span class="pre">u'\xfoo'</span> <span class="pre">in</span> <span class="pre">position</span> <span class="pre">bar</span></tt> (or just about any other +<tt class="docutils literal"><span class="pre">UnicodeEncodeError</span></tt>) - This is not a problem with Beautiful Soup. +This problem shows up in two main situations. First, when you try to +print a Unicode character that your console doesn’t know how to +display. (See <a class="reference external" href="http://wiki.python.org/moin/PrintFails">this page on the Python wiki</a> for help.) Second, when +you’re writing to a file and you pass in a Unicode character that’s +not supported by your default encoding. In this case, the simplest +solution is to explicitly encode the Unicode string into UTF-8 with +<tt class="docutils literal"><span class="pre">u.encode("utf8")</span></tt>.</li> +<li><tt class="docutils literal"><span class="pre">KeyError:</span> <span class="pre">[attr]</span></tt> - Caused by accessing <tt class="docutils literal"><span class="pre">tag['attr']</span></tt> when the +tag in question doesn’t define the <tt class="docutils literal"><span class="pre">attr</span></tt> attribute. The most +common errors are <tt class="docutils literal"><span class="pre">KeyError:</span> <span class="pre">'href'</span></tt> and <tt class="docutils literal"><span class="pre">KeyError:</span> +<span class="pre">'class'</span></tt>. Use <tt class="docutils literal"><span class="pre">tag.get('attr')</span></tt> if you’re not sure <tt class="docutils literal"><span class="pre">attr</span></tt> is +defined, just as you would with a Python dictionary.</li> +<li><tt class="docutils literal"><span class="pre">AttributeError:</span> <span class="pre">'ResultSet'</span> <span class="pre">object</span> <span class="pre">has</span> <span class="pre">no</span> <span class="pre">attribute</span> <span class="pre">'foo'</span></tt> - This +usually happens because you expected <tt class="docutils literal"><span class="pre">find_all()</span></tt> to return a +single tag or string. But <tt class="docutils literal"><span class="pre">find_all()</span></tt> returns a _list_ of tags +and strings–a <tt class="docutils literal"><span class="pre">ResultSet</span></tt> object. You need to iterate over the +list and look at the <tt class="docutils literal"><span class="pre">.foo</span></tt> of each one. Or, if you really only +want one result, you need to use <tt class="docutils literal"><span class="pre">find()</span></tt> instead of +<tt class="docutils literal"><span class="pre">find_all()</span></tt>.</li> +<li><tt class="docutils literal"><span class="pre">AttributeError:</span> <span class="pre">'NoneType'</span> <span class="pre">object</span> <span class="pre">has</span> <span class="pre">no</span> <span class="pre">attribute</span> <span class="pre">'foo'</span></tt> - This +usually happens because you called <tt class="docutils literal"><span class="pre">find()</span></tt> and then tried to +access the <cite>.foo`</cite> attribute of the result. But in your case, +<tt class="docutils literal"><span class="pre">find()</span></tt> didn’t find anything, so it returned <tt class="docutils literal"><span class="pre">None</span></tt>, instead of +returning a tag or a string. You need to figure out why your +<tt class="docutils literal"><span class="pre">find()</span></tt> call isn’t returning anything.</li> +</ul> +</div> +<div class="section" id="id60"> +<h2>パフォーマンス改善<a class="headerlink" href="#id60" title="Permalink to this headline">¶</a></h2> +<p>Beautiful Soup will never be as fast as the parsers it sits on top +of. If response time is critical, if you’re paying for computer time +by the hour, or if there’s any other reason why computer time is more +valuable than programmer time, you should forget about Beautiful Soup +and work directly atop <a class="reference external" href="http://lxml.de/">lxml</a>.</p> +<p>That said, there are things you can do to speed up Beautiful Soup. If +you’re not using lxml as the underlying parser, my advice is to +<a class="reference internal" href="#parser-installation"><em>start</em></a>. Beautiful Soup parses documents +significantly faster using lxml than using html.parser or html5lib.</p> +<p>You can speed up encoding detection significantly by installing the +<a class="reference external" href="http://pypi.python.org/pypi/cchardet/">cchardet</a> library.</p> +<p><a class="reference internal" href="#id53">ドキュメントの一部をパース</a> won’t save you much time parsing +the document, but it can save a lot of memory, and it’ll make +<cite>searching</cite> the document much faster.</p> +</div> +</div> +<div class="section" id="beautiful-soup-3"> +<h1>Beautiful Soup 3<a class="headerlink" href="#beautiful-soup-3" title="Permalink to this headline">¶</a></h1> +<p>Beautiful Soup 3は一つ前のリリースで、すでに開発は停止しています。 +現在でも、全ての主なLinuxディストリビューションに含まれています。:</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">apt-get</span> <span class="pre">install</span> <span class="pre">python-beautifulsoup</span></tt></p> +<p>Pypiでも <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> として利用できます。</p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">easy_install</span> <span class="pre">BeautifulSoup</span></tt></p> +<p><tt class="kbd docutils literal"><span class="pre">$</span> <span class="pre">pip</span> <span class="pre">install</span> <span class="pre">BeautifulSoup</span></tt></p> +<p>次のリンクからダウンロードできます。<a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/download/3.x/BeautifulSoup-3.2.0.tar.gz">tarball of Beautiful Soup 3.2.0</a>.</p> +<p><tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">beautifulsoup</span></tt> , <tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">BeautifulSoup</span></tt> というコマンドでBeautiful Soupをインストールすると、あなたのコードは動きません。 <tt class="docutils literal"><span class="pre">easy_install</span> <span class="pre">beautifulsoup4</span></tt> と入力しましょう。</p> +<p><a class="reference external" href="http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html">Beautiful Soup 3 のドキュメントはアーカイブされています。</a></p> +<p>日本語版は次のリンクから参照できます。 <a class="reference external" href="http://tdoc.info/beautifulsoup/">Beautiful Soup ドキュメント</a> +Beautiful Soup 4での変更点が理解するために、これらのドキュメントを読んでみてください。</p> +<div class="section" id="bs4"> +<h2>BS4への移行<a class="headerlink" href="#bs4" title="Permalink to this headline">¶</a></h2> +<p>多くのBS3で書かれたコードは、一か所変更するだけでBS4で動きます。パッケージ名を <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> から <tt class="docutils literal"><span class="pre">bs4</span></tt> に変更するだけです。これを、、:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">BeautifulSoup</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span> +</pre></div> +</div> +<p>以下のようにします。:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="kn">from</span> <span class="nn">bs4</span> <span class="kn">import</span> <span class="n">BeautifulSoup</span> +</pre></div> +</div> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">ImportError</span></tt> “No module named BeautifulSoup” が表示された場合、BS4しかインストールされていないのに、BS3のコードを実行しようとしたのが問題です。</li> +</ul> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">ImportError</span></tt> “No module named bs4” が表示された場合、BS3しかインストールされていないのに、BS4のコードを実行しようとしたのが問題です。</li> +</ul> +<p>BS4はBS3の大部分について後方互換性がありますが、それらのメソッドのほとんどは変更され`PEP 8 規約 <<a class="reference external" href="http://www.python.org/dev/peps/pep-0008/">http://www.python.org/dev/peps/pep-0008/</a>>`_ に沿った新しい名前になっています。多くの名前等の変更により、後方互換性の一部が損なわれています。</p> +<p>以下は、BS3のコードをBS4に変換するのに知っておくべき事項です。:</p> +<div class="section" id="id63"> +<h3>パーサー<a class="headerlink" href="#id63" title="Permalink to this headline">¶</a></h3> +<p>Beautiful Soup 3 used Python’s <tt class="docutils literal"><span class="pre">SGMLParser</span></tt>, a module that was +deprecated and removed in Python 3.0. Beautiful Soup 4 uses +<tt class="docutils literal"><span class="pre">html.parser</span></tt> by default, but you can plug in lxml or html5lib and +use that instead. See <a class="reference internal" href="#id10">パーサーのインストール</a> for a comparison.</p> +<p>Since <tt class="docutils literal"><span class="pre">html.parser</span></tt> is not the same parser as <tt class="docutils literal"><span class="pre">SGMLParser</span></tt>, it +will treat invalid markup differently. Usually the “difference” is +that <tt class="docutils literal"><span class="pre">html.parser</span></tt> crashes. In that case, you’ll need to install +another parser. But sometimes <tt class="docutils literal"><span class="pre">html.parser</span></tt> just creates a different +parse tree than <tt class="docutils literal"><span class="pre">SGMLParser</span></tt> would. If this happens, you may need to +update your BS3 scraping code to deal with the new tree.</p> +</div> +<div class="section" id="id64"> +<h3>メソッド名<a class="headerlink" href="#id64" title="Permalink to this headline">¶</a></h3> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">renderContents</span></tt> -> <tt class="docutils literal"><span class="pre">encode_contents</span></tt></li> +<li><tt class="docutils literal"><span class="pre">replaceWith</span></tt> -> <tt class="docutils literal"><span class="pre">replace_with</span></tt></li> +<li><tt class="docutils literal"><span class="pre">replaceWithChildren</span></tt> -> <tt class="docutils literal"><span class="pre">unwrap</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findAll</span></tt> -> <tt class="docutils literal"><span class="pre">find_all</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findAllNext</span></tt> -> <tt class="docutils literal"><span class="pre">find_all_next</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findAllPrevious</span></tt> -> <tt class="docutils literal"><span class="pre">find_all_previous</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findNext</span></tt> -> <tt class="docutils literal"><span class="pre">find_next</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findNextSibling</span></tt> -> <tt class="docutils literal"><span class="pre">find_next_sibling</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findNextSiblings</span></tt> -> <tt class="docutils literal"><span class="pre">find_next_siblings</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findParent</span></tt> -> <tt class="docutils literal"><span class="pre">find_parent</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findParents</span></tt> -> <tt class="docutils literal"><span class="pre">find_parents</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findPrevious</span></tt> -> <tt class="docutils literal"><span class="pre">find_previous</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findPreviousSibling</span></tt> -> <tt class="docutils literal"><span class="pre">find_previous_sibling</span></tt></li> +<li><tt class="docutils literal"><span class="pre">findPreviousSiblings</span></tt> -> <tt class="docutils literal"><span class="pre">find_previous_siblings</span></tt></li> +<li><tt class="docutils literal"><span class="pre">nextSibling</span></tt> -> <tt class="docutils literal"><span class="pre">next_sibling</span></tt></li> +<li><tt class="docutils literal"><span class="pre">previousSibling</span></tt> -> <tt class="docutils literal"><span class="pre">previous_sibling</span></tt></li> +</ul> +<p>Some arguments to the Beautiful Soup constructor were renamed for the +same reasons:</p> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">BeautifulSoup(parseOnlyThese=...)</span></tt> -> <tt class="docutils literal"><span class="pre">BeautifulSoup(parse_only=...)</span></tt></li> +<li><tt class="docutils literal"><span class="pre">BeautifulSoup(fromEncoding=...)</span></tt> -> <tt class="docutils literal"><span class="pre">BeautifulSoup(from_encoding=...)</span></tt></li> +</ul> +<p>I renamed one method for compatibility with Python 3:</p> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">Tag.has_key()</span></tt> -> <tt class="docutils literal"><span class="pre">Tag.has_attr()</span></tt></li> +</ul> +<p>I renamed one attribute to use more accurate terminology:</p> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">Tag.isSelfClosing</span></tt> -> <tt class="docutils literal"><span class="pre">Tag.is_empty_element</span></tt></li> +</ul> +<p>I renamed three attributes to avoid using words that have special +meaning to Python. Unlike the others, these changes are <em>not backwards +compatible.</em> If you used these attributes in BS3, your code will break +on BS4 until you change them.</p> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">UnicodeDammit.unicode</span></tt> -> <tt class="docutils literal"><span class="pre">UnicodeDammit.unicode_markup</span></tt></li> +<li><tt class="docutils literal"><span class="pre">Tag.next</span></tt> -> <tt class="docutils literal"><span class="pre">Tag.next_element</span></tt></li> +<li><tt class="docutils literal"><span class="pre">Tag.previous</span></tt> -> <tt class="docutils literal"><span class="pre">Tag.previous_element</span></tt></li> +</ul> +</div> +<div class="section" id="id65"> +<h3>ジェネレーター<a class="headerlink" href="#id65" title="Permalink to this headline">¶</a></h3> +<p>I gave the generators PEP 8-compliant names, and transformed them into +properties:</p> +<ul class="simple"> +<li><tt class="docutils literal"><span class="pre">childGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">children</span></tt></li> +<li><tt class="docutils literal"><span class="pre">nextGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">next_elements</span></tt></li> +<li><tt class="docutils literal"><span class="pre">nextSiblingGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">next_siblings</span></tt></li> +<li><tt class="docutils literal"><span class="pre">previousGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">previous_elements</span></tt></li> +<li><tt class="docutils literal"><span class="pre">previousSiblingGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">previous_siblings</span></tt></li> +<li><tt class="docutils literal"><span class="pre">recursiveChildGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">descendants</span></tt></li> +<li><tt class="docutils literal"><span class="pre">parentGenerator()</span></tt> -> <tt class="docutils literal"><span class="pre">parents</span></tt></li> +</ul> +<p>So instead of this:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">parentGenerator</span><span class="p">():</span> + <span class="o">...</span> +</pre></div> +</div> +<p>You can write this:</p> +<div class="highlight-python"><div class="highlight"><pre><span class="k">for</span> <span class="n">parent</span> <span class="ow">in</span> <span class="n">tag</span><span class="o">.</span><span class="n">parents</span><span class="p">:</span> + <span class="o">...</span> +</pre></div> +</div> +<p>(But the old code will still work.)</p> +<p>Some of the generators used to yield <tt class="docutils literal"><span class="pre">None</span></tt> after they were done, and +then stop. That was a bug. Now the generators just stop.</p> +<p>There are two new generators, <a class="reference internal" href="#string-generators"><em>.strings and +.stripped_strings</em></a>. <tt class="docutils literal"><span class="pre">.strings</span></tt> yields +NavigableString objects, and <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt> yields Python +strings that have had whitespace stripped.</p> +</div> +<div class="section" id="id66"> +<h3>XML<a class="headerlink" href="#id66" title="Permalink to this headline">¶</a></h3> +<p>There is no longer a <tt class="docutils literal"><span class="pre">BeautifulStoneSoup</span></tt> class for parsing XML. To +parse XML you pass in “xml” as the second argument to the +<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor. For the same reason, the +<tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor no longer recognizes the <tt class="docutils literal"><span class="pre">isHTML</span></tt> +argument.</p> +<p>Beautiful Soup’s handling of empty-element XML tags has been +improved. Previously when you parsed XML you had to explicitly say +which tags were considered empty-element tags. The <tt class="docutils literal"><span class="pre">selfClosingTags</span></tt> +argument to the constructor is no longer recognized. Instead, +Beautiful Soup considers any empty tag to be an empty-element tag. If +you add a child to an empty-element tag, it stops being an +empty-element tag.</p> +</div> +<div class="section" id="id67"> +<h3>エンティティ<a class="headerlink" href="#id67" title="Permalink to this headline">¶</a></h3> +<p>An incoming HTML or XML entity is always converted into the +corresponding Unicode character. Beautiful Soup 3 had a number of +overlapping ways of dealing with entities, which have been +removed. The <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor no longer recognizes the +<tt class="docutils literal"><span class="pre">smartQuotesTo</span></tt> or <tt class="docutils literal"><span class="pre">convertEntities</span></tt> arguments. (<a class="reference internal" href="#unicode-dammit">Unicode, +Dammit</a> still has <tt class="docutils literal"><span class="pre">smart_quotes_to</span></tt>, but its default is now to turn +smart quotes into Unicode.) The constants <tt class="docutils literal"><span class="pre">HTML_ENTITIES</span></tt>, +<tt class="docutils literal"><span class="pre">XML_ENTITIES</span></tt>, and <tt class="docutils literal"><span class="pre">XHTML_ENTITIES</span></tt> have been removed, since they +configure a feature (transforming some but not all entities into +Unicode characters) that no longer exists.</p> +<p>If you want to turn Unicode characters back into HTML entities on +output, rather than turning them into UTF-8 characters, you need to +use an <a class="reference internal" href="#output-formatters"><em>output formatter</em></a>.</p> +</div> +<div class="section" id="id68"> +<h3>その他<a class="headerlink" href="#id68" title="Permalink to this headline">¶</a></h3> +<p><a class="reference internal" href="#string"><em>Tag.string</em></a> now operates recursively. If tag A +contains a single tag B and nothing else, then A.string is the same as +B.string. (Previously, it was None.)</p> +<p><a class="reference internal" href="#id15">値が複数のとき</a> like <tt class="docutils literal"><span class="pre">class</span></tt> have lists of strings as +their values, not strings. This may affect the way you search by CSS +class.</p> +<p>If you pass one of the <tt class="docutils literal"><span class="pre">find*</span></tt> methods both <a class="reference internal" href="#text"><em>text</em></a> <cite>and</cite> +a tag-specific argument like <a class="reference internal" href="#name"><em>name</em></a>, Beautiful Soup will +search for tags that match your tag-specific criteria and whose +<a class="reference internal" href="#string"><em>Tag.string</em></a> matches your value for <a class="reference internal" href="#text"><em>text</em></a>. It will <cite>not</cite> find the strings themselves. Previously, +Beautiful Soup ignored the tag-specific arguments and looked for +strings.</p> +<p>The <tt class="docutils literal"><span class="pre">BeautifulSoup</span></tt> constructor no longer recognizes the +<cite>markupMassage</cite> argument. It’s now the parser’s responsibility to +handle markup correctly.</p> +<p>The rarely-used alternate parser classes like +<tt class="docutils literal"><span class="pre">ICantBelieveItsBeautifulSoup</span></tt> and <tt class="docutils literal"><span class="pre">BeautifulSOAP</span></tt> have been +removed. It’s now the parser’s decision how to handle ambiguous +markup.</p> +<p>The <tt class="docutils literal"><span class="pre">prettify()</span></tt> method now returns a Unicode string, not a bytestring.</p> +</div> +</div> +</div> + + + </div> + </div> + </div> + <div class="sphinxsidebar"> + <div class="sphinxsidebarwrapper"> + <h3><a href="#">Table Of Contents</a></h3> + <ul> +<li><a class="reference internal" href="#">Beautiful Soup</a><ul> +<li><a class="reference internal" href="#id2">(訳注)石鹸は食べられない</a></li> +<li><a class="reference internal" href="#id3">この文書について</a></li> +<li><a class="reference internal" href="#id5">助けてほしいときは</a></li> +</ul> +</li> +<li><a class="reference internal" href="#id7">クイックスタート</a></li> +<li><a class="reference internal" href="#id8">インストール</a><ul> +<li><a class="reference internal" href="#id9">インストール後の問題</a></li> +<li><a class="reference internal" href="#parser-installation">パーサーのインストール</a></li> +</ul> +</li> +<li><a class="reference internal" href="#id11">スープの作成</a></li> +<li><a class="reference internal" href="#id12">4種類のオブジェクト</a><ul> +<li><a class="reference internal" href="#tag-obj">Tag obj.</a><ul> +<li><a class="reference internal" href="#id13">名前</a></li> +<li><a class="reference internal" href="#id14">属性</a><ul> +<li><a class="reference internal" href="#id15">値が複数のとき</a></li> +</ul> +</li> +</ul> +</li> +<li><a class="reference internal" href="#navigablestring-obj">NavigableString obj.</a></li> +<li><a class="reference internal" href="#beautifulsoup-obj">BeautifulSoup obj.</a></li> +<li><a class="reference internal" href="#comments-obj">Comments obj. 他</a></li> +</ul> +</li> +<li><a class="reference internal" href="#id16">パースツリーを探索</a><ul> +<li><a class="reference internal" href="#id17">子要素へ下移動</a><ul> +<li><a class="reference internal" href="#id18">タグ名で探索</a></li> +<li><a class="reference internal" href="#contents-children"><tt class="docutils literal"><span class="pre">.contents</span></tt> / <tt class="docutils literal"><span class="pre">.children</span></tt></a></li> +<li><a class="reference internal" href="#descendants"><tt class="docutils literal"><span class="pre">.descendants</span></tt></a></li> +<li><a class="reference internal" href="#string"><tt class="docutils literal"><span class="pre">.string</span></tt></a></li> +<li><a class="reference internal" href="#strings-stripped-strings"><tt class="docutils literal"><span class="pre">.strings</span></tt> / <tt class="docutils literal"><span class="pre">.stripped_strings</span></tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#id20">親要素へ上移動</a><ul> +<li><a class="reference internal" href="#parent"><tt class="docutils literal"><span class="pre">.parent</span></tt></a></li> +<li><a class="reference internal" href="#parents"><tt class="docutils literal"><span class="pre">.parents</span></tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#id23">兄弟要素へ横移動</a><ul> +<li><a class="reference internal" href="#next-sibling-previous-sibling"><tt class="docutils literal"><span class="pre">.next_sibling</span></tt> / <tt class="docutils literal"><span class="pre">.previous_sibling</span></tt></a></li> +<li><a class="reference internal" href="#next-siblings-previous-siblings"><tt class="docutils literal"><span class="pre">.next_siblings</span></tt> / <tt class="docutils literal"><span class="pre">.previous_siblings</span></tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#id24">前後の要素へ移動</a><ul> +<li><a class="reference internal" href="#next-element-previous-element"><tt class="docutils literal"><span class="pre">.next_element</span></tt> / <tt class="docutils literal"><span class="pre">.previous_element</span></tt></a></li> +<li><a class="reference internal" href="#next-elements-previous-elements"><tt class="docutils literal"><span class="pre">.next_elements</span></tt> / <tt class="docutils literal"><span class="pre">.previous_elements</span></tt></a></li> +</ul> +</li> +</ul> +</li> +<li><a class="reference internal" href="#id25">パースツリーを検索</a><ul> +<li><a class="reference internal" href="#id26">フィルターの種類</a><ul> +<li><a class="reference internal" href="#id27">文字列</a></li> +<li><a class="reference internal" href="#id28">正規表現</a></li> +<li><a class="reference internal" href="#id29">リスト</a></li> +<li><a class="reference internal" href="#true">True値</a></li> +<li><a class="reference internal" href="#id30">関数</a></li> +</ul> +</li> +<li><a class="reference internal" href="#find-all"><tt class="docutils literal"><span class="pre">find_all()</span></tt></a><ul> +<li><a class="reference internal" href="#id31">name引数</a></li> +<li><a class="reference internal" href="#id32">キーワード引数</a></li> +<li><a class="reference internal" href="#css">CSSのクラスで検索</a></li> +<li><a class="reference internal" href="#id33">text引数</a></li> +<li><a class="reference internal" href="#limit">limit引数</a></li> +<li><a class="reference internal" href="#recursive">recursive引数</a></li> +<li><a class="reference internal" href="#id36">ショートカット</a></li> +</ul> +</li> +<li><a class="reference internal" href="#find"><tt class="docutils literal"><span class="pre">find()</span></tt></a></li> +<li><a class="reference internal" href="#find-parents-find-parent"><tt class="docutils literal"><span class="pre">find_parents()</span></tt> / <tt class="docutils literal"><span class="pre">find_parent()</span></tt></a></li> +<li><a class="reference internal" href="#find-next-siblings-find-next-sibling"><tt class="docutils literal"><span class="pre">find_next_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_next_sibling()</span></tt></a></li> +<li><a class="reference internal" href="#find-previous-siblings-find-previous-sibling"><tt class="docutils literal"><span class="pre">find_previous_siblings()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous_sibling()</span></tt></a></li> +<li><a class="reference internal" href="#find-all-next-find-next"><tt class="docutils literal"><span class="pre">find_all_next()</span></tt> / <tt class="docutils literal"><span class="pre">find_next()</span></tt></a></li> +<li><a class="reference internal" href="#find-all-previous-find-previous"><tt class="docutils literal"><span class="pre">find_all_previous()</span></tt> / <tt class="docutils literal"><span class="pre">find_previous()</span></tt></a></li> +<li><a class="reference internal" href="#id37">CSSセレクタ</a></li> +</ul> +</li> +<li><a class="reference internal" href="#id38">パースツリーを修正</a><ul> +<li><a class="reference internal" href="#id39">名前や属性の変更</a></li> +<li><a class="reference internal" href="#id40"><tt class="docutils literal"><span class="pre">.string</span></tt> の修正</a></li> +<li><a class="reference internal" href="#append"><tt class="docutils literal"><span class="pre">append()</span></tt></a></li> +<li><a class="reference internal" href="#beautifulsoup-new-string-new-tag"><tt class="docutils literal"><span class="pre">BeautifulSoup.new_string()</span></tt> / <tt class="docutils literal"><span class="pre">.new_tag()</span></tt></a></li> +<li><a class="reference internal" href="#insert"><tt class="docutils literal"><span class="pre">insert()</span></tt></a></li> +<li><a class="reference internal" href="#insert-before-insert-after"><tt class="docutils literal"><span class="pre">insert_before()</span></tt> / <tt class="docutils literal"><span class="pre">insert_after()</span></tt></a></li> +<li><a class="reference internal" href="#clear"><tt class="docutils literal"><span class="pre">clear()</span></tt></a></li> +<li><a class="reference internal" href="#extract"><tt class="docutils literal"><span class="pre">extract()</span></tt></a></li> +<li><a class="reference internal" href="#decompose"><tt class="docutils literal"><span class="pre">decompose()</span></tt></a></li> +<li><a class="reference internal" href="#replace-with"><tt class="docutils literal"><span class="pre">replace_with()</span></tt></a></li> +<li><a class="reference internal" href="#wrap"><tt class="docutils literal"><span class="pre">wrap()</span></tt></a></li> +<li><a class="reference internal" href="#unwrap"><tt class="docutils literal"><span class="pre">unwrap()</span></tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#id42">出力</a><ul> +<li><a class="reference internal" href="#id43">きれいに出力</a></li> +<li><a class="reference internal" href="#id44">一行に出力</a></li> +<li><a class="reference internal" href="#id45">フォーマットを指定</a></li> +<li><a class="reference internal" href="#get-text"><tt class="docutils literal"><span class="pre">get_text()</span></tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#id46">パーサーの指定</a><ul> +<li><a class="reference internal" href="#id47">パーサーの違い</a></li> +</ul> +</li> +<li><a class="reference internal" href="#id48">エンコード</a><ul> +<li><a class="reference internal" href="#id49">出力のエンコード</a></li> +<li><a class="reference internal" href="#unicode-dammit">Unicode, Dammit</a><ul> +<li><a class="reference internal" href="#id50">スマート引用符</a></li> +<li><a class="reference internal" href="#id52">複数の文字コード</a></li> +</ul> +</li> +</ul> +</li> +<li><a class="reference internal" href="#id53">ドキュメントの一部をパース</a><ul> +<li><a class="reference internal" href="#soupstrainer"><tt class="docutils literal"><span class="pre">SoupStrainer</span></tt></a></li> +</ul> +</li> +<li><a class="reference internal" href="#id54">トラブルシューティング</a><ul> +<li><a class="reference internal" href="#diagnose"><tt class="docutils literal"><span class="pre">diagnose()</span></tt></a></li> +<li><a class="reference internal" href="#id56">パース時に出るエラー</a></li> +<li><a class="reference internal" href="#id57">バージョン違いの問題</a></li> +<li><a class="reference internal" href="#xml">XMLのパース</a></li> +<li><a class="reference internal" href="#id58">その他のパーサーの問題</a></li> +<li><a class="reference internal" href="#misc">その他</a></li> +<li><a class="reference internal" href="#id60">パフォーマンス改善</a></li> +</ul> +</li> +<li><a class="reference internal" href="#beautiful-soup-3">Beautiful Soup 3</a><ul> +<li><a class="reference internal" href="#bs4">BS4への移行</a><ul> +<li><a class="reference internal" href="#id63">パーサー</a></li> +<li><a class="reference internal" href="#id64">メソッド名</a></li> +<li><a class="reference internal" href="#id65">ジェネレーター</a></li> +<li><a class="reference internal" href="#id66">XML</a></li> +<li><a class="reference internal" href="#id67">エンティティ</a></li> +<li><a class="reference internal" href="#id68">その他</a></li> +</ul> +</li> +</ul> +</li> +</ul> + + <h3>This Page</h3> + <ul class="this-page-menu"> + <li><a href="_sources/index.txt" + rel="nofollow">Show Source</a></li> + </ul> + +<div id="searchbox" style="display: none"> + <h3>Quick search</h3> + <form class="search" action="search.html" method="get"> + <input type="text" name="q" /> + <input type="submit" value="Go" /> + <input type="hidden" name="check_keywords" value="yes" /> + <input type="hidden" name="area" value="default" /> + </form> + <p class="searchtip" style="font-size: 90%"> + Enter search terms or a module, class or function name. + </p> +</div> +<script type="text/javascript">$('#searchbox').show(0);</script> + +<script> + (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ + (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), + m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) + })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); + + ga('create', 'UA-23795927-33', 'kondou.com'); + ga('send', 'pageview'); + +</script> + + + </div> + </div> + <div class="clearer"></div> + </div> + <div class="related"> + <h3>Navigation</h3> + <ul> + <li class="right" style="margin-right: 10px"> + <a href="genindex.html" title="General Index" + >index</a></li> + <li><a href="#">Beautiful Soup 4.2.0 Doc. 日本語訳 (2013-11-19最終更新)</a> »</li> + </ul> + </div> + <div class="footer"> + © Copyright 2013, Leonard Richardson. + Created using <a href="http://sphinx-doc.org/">Sphinx</a> 1.2. + </div> + </body> +</html> |