質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SEO

SEO(Search Engine Optimization)は、検索エンジンでウェブページがランキング上位に上がるように工夫する様々なテクニックの事です。

Q&A

解決済

1回答

739閲覧

python(Beautiful Soup使用)で見出し間の文字数を数えたい

like_kinesis

総合スコア8

スクレイピング

スクレイピングとは、公開されているWebサイトからページ内の情報を抽出する技術です。

Beautiful Soup

Beautiful Soupは、Pythonのライブラリの一つ。スクレイピングに特化しています。HTMLデータの構文の解析を行うために、HTMLタグ/CSSのセレクタで抽出する部分を指定することが可能です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SEO

SEO(Search Engine Optimization)は、検索エンジンでウェブページがランキング上位に上がるように工夫する様々なテクニックの事です。

0グッド

0クリップ

投稿2019/02/27 04:50

python(Beautiful Soup使用)で見出しと見出しの間の文字数を数えたい

ワードプレスで運営している自サイトの見出しと見出しの間の文字を数えたいです(SEO的な意味で)

数百記事あるのでスクレイピングで行いたく、詰まっています。
python3
Beautiful Soup
を使っています。

サンプルHTMLが

html

1<div class="entry-content"> 2 <p><img /></p> 3 <p>いろはに</p> 4 <div ><div class="st-in-mybox"> 5 <ul> 6 <li>111</li> 7 <li>222</li> 8 <li>333</li> 9 </ul> 10 </div></div> 11 <p>ほへと</p> 12 <h2>1個目のH2タグ</h2> 13 <p>ちりぬるを</p> 14 <p>わかよたれそ</p> 15 <h3>H3タグ_ほげほげ</h3> 16 <p>あいうえお</p> 17 <p>かきくけこ</p> 18 <h2>2個目のH2タグ</h2> 19 20 ・・略・・ 21</div> 22

だとして、
16文字
1個目のH2タグ(タグの中の文字列を持ってきたい)
11文字
H3タグ_ほげほげ

と出力したいです。
h2,h3タグと数えたいpタグ等が同じ階層にあるためうまくいきません。
また、pタグ,liタグ,aタグ等が考えられ、汎用性のあるコードが思いつきません。

そもそもBeautiful Soupの選択を変えるべきでしょうか?

python

1page_s = page.select('css_selector_to_target > div.entry-content') 2 3for page_loop in page_s: 4 5 h3 = page_loop.find("h3").text 6 print("h3テキスト > " + h3) 7

という感じまで進んでいます。
初心者かつ独学なので、質問以外の点でも、
おかしい所あったらご指摘お願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1html = '''<div class="entry-content"> 2 <p><img /></p> 3 <p>いろはに</p> 4 <div ><div class="st-in-mybox"> 5 <ul> 6 <li>111</li> 7 <li>222</li> 8 <li>333</li> 9 </ul> 10 </div></div> 11 <p>ほへと</p> 12 <h2>1個目のH2タグ</h2> 13 <p>ちりぬるを</p> 14 <p>わかよたれそ</p> 15 <h3>H3タグ_ほげほげ</h3> 16 <p>あいうえお</p> 17 <p>かきくけこ</p> 18 <h2>2個目のH2タグ</h2> 19</div>''' 20 21import re 22from bs4 import BeautifulSoup 23 24soup = BeautifulSoup(html, 'lxml') 25 26text = '' 27for tag in soup.find_all(): 28 if re.match(r'h\d$', tag.name): 29 # h1, h2, ..., h6 タグが見つかった場合、それ以前の文字数を出力する。 30 print('{} ({}文字), {}'.format(text, len(text), tag)) 31 text = '' 32 elif tag.string: 33 # h1, h2, ..., h6 タグ以外で値を持つタグの場合 34 text += tag.string
いろはに111222333ほへと (16文字), <h2>1個目のH2タグ</h2> ちりぬるをわかよたれそ (11文字), <h3>H3タグ_ほげほげ</h3> あいうえおかきくけこ (10文字), <h2>2個目のH2タグ</h2>

投稿2019/02/27 05:08

tiitoi

総合スコア21956

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

like_kinesis

2019/02/27 05:38

ありがとうございます。望む出力が得られたました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問