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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

830閲覧

特定の文字列の間にある文字列のみ抽出したいです。

onodesu

総合スコア11

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/11/15 11:55

【前提】下記文字列があったとします。

<section class="post-content" itemprop="text"> あいうえお かきくけこ <h3>ABCD</h3> </section>

【やりたいこと】
あいうえお
かきくけこ

のみ抽出したいです。

何卒よろしくお願い申し上げます。

【試してみたこと】

target = '<h3>'
idx = contents.find(target)
content = contents[:idx]

【エラー】

File "C:\Users\info\ドキュメント\python_practice\wp_auto_login_post.py", line 18, in <module>
content = contents[:idx]
File "C:\Users\info\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.9_qbz5n2kfra8p0\LocalCache\local-packages\Python39\site-packages\bs4\element.py", line 1486, in getitem
return self.attrs[key]
TypeError: unhashable type: 'slice'

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

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

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

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

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

guest

回答2

0

ベストアンサー

複数行なので re.S(re.DOTALL)を指定します。

import re text = ''' <section class="post-content" itemprop="text"> あいうえお かきくけこ <h3>ABCD</h3> </section> '''.strip() m = re.search(r'<section.+?>(.+?)<h3>.*?</h3>.*?</section>', text, re.S) matched = m.group(1).strip() print(matched) # あいうえお かきくけこ

投稿2021/11/15 12:38

編集2021/11/15 12:40
melian

総合スコア20655

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

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

onodesu

2021/11/15 12:48

ありがとうございます! 下記部分について ------------ <section class="post-content" itemprop="text"> あいうえお かきくけこ <h3>ABCD</h3> </section> ------------ BeautifulSoupを使って取得しており 抽出した上記部分を contents = として、定義おります。 その場合、下記でよいかと思い、実行したのですが、 --------------- text = contents.strip() m = re.search(r'<section.+?>(.+?)<h3>.*?</h3>.*?</section>', text, re.S) matched = m.group(1).strip() print(matched) --------------- 下記エラーが出てしまいます。。。。 ext = contents.strip() TypeError: 'NoneType' object is not callable 書き方が違いますでしょうか?
melian

2021/11/15 12:58 編集

エラーはその行で出ていますか? また、print(contents) の実行結果を教えてもらえますか?
onodesu

2021/11/15 13:05

print(contents)の内容です! 相当長いので、<h3>あたりまで、転記いたします! よろしくお願いいたします! ↓ <section class="post-content" itemprop="text"> <div id="toi"><strong>【問題】</strong><br/> 賃借人の家屋明渡債務が賃貸人の敷金返還債務に対し先履行の関係に立つと解すべき場合、賃借人は賃貸人に対し敷金返還請求権をもって家屋につき留置権を取得す る余地はない。 </div> <p> <br/> <a href="#kotae">>解答と解説はこちら</a></p> <div id="kaitou"> <a name="kotae"></a> <div id="toi"><strong>【問題】</strong><br/> 賃借人の家屋明渡債務が賃貸人の敷金返還債務に対し先履行の関係に立つと解すべき場合、賃借人は賃貸人に対し敷金返還請求権をもって家屋につき留置権を取得す る余地はない。 </div> <p> <br/> <strong>【解答】</strong><br/> 正しい<br/> <br/> <strong>【解説】</strong><br/> 賃借人の家屋明渡債務が賃貸人の敷金返還債務に対し先履行の関係に立つと解すべき場合、「<span style="color: #ff0000;"><strong>賃借人の明渡しが先</strong></span>」で、「<span style="color: #0000ff;"><strong>賃貸人の敷金の返還は後</strong></span>」です。つまり、賃借人は敷金が返還されていないことを理由 に、家屋の明渡しを拒むことはできません。<br/> 言い換えると、賃借人は賃貸人に対し敷金返還請求権をもって家屋につき留置権を取得する余地はありません。<br/> よって、正しいです。「敷金返還請求権をもって家屋につき留置権を取得する余地はない。」という部分は<span style="color: #ff0000;"><strong>理解すべき部分 </strong></span>なので、<a href="https://takken-success.info/lp/lpp/" rel="noopener" target="_blank"><strong>個別指導</strong></a>で解説します! </p></div> <p> <br/> <a href="https://takken-success.info/lp/merumaga/" rel="noopener" target="_blank"><img alt="" class="alignnone wp-image-25496 size-full" height="252" src="https://xn--09s63f.asia/wp/wp-content/uploads/2021/11/adメルマガ登録4年.gif" width="670"/></a><br/> <h3>令和3年・2021年(10月試験)の過去問</h3> <table summary="宅建過去問・令和3年・2021年(10月試験)の宅建試験"> <tbody> <tr> ・・・・ </section>
onodesu

2021/11/15 13:06

エラーは下記の通りです。 Traceback (most recent call last): File "C:\Users\info\ドキュメント\python_practice\wp_auto_login_post.py", line 16, in <module> text = contents.strip() TypeError: 'NoneType' object is not callable
melian

2021/11/15 13:15

ありがとうございます。こちらで試してみたところ、問題はありませんでした(<section ..> から <h3> までの文字列を抽出しました)。 そこで、お手数ですが、print(type(contents)) の実行結果を教えてもらえますか? また、 text = contents とした場合にどうなるのかも教えて下さい。
onodesu

2021/11/15 13:33

すみません。記述したコードをお送りいたします! おそらくエラーが出ると思うのですが。。。 import requests from bs4 import BeautifulSoup import re url = 'https://xn--09s63f.asia/kakomon2021-10/1-1/' res = requests.get(url) soup = BeautifulSoup(res.text, "html.parser") contents = soup.find("section" , class_="post-content") text = contents.strip() m = re.search(r'<section.+?>(.+?)<h3>.*?</h3>.*?</section>', text, re.S) matched = m.group(1).strip() print(matched)
onodesu

2021/11/15 13:34

urlの後ろについて、「&#039;」となっていますが「'」です!
melian

2021/11/15 13:53

ありがとうございます。この場合ですと、 text = res.text になります。BeautifulSoup ではなく requst の方の text(HTML ソースの全体が入っています)を使います。
onodesu

2021/11/15 14:49

ありがとうございます! できました! ただ、なぜ、BeautifulSoupがだめだったのでしょうか? もちろん、行数も多くなり、melian様の方が簡潔です。 もし、お手間でなければ教えていただければ幸いです。 初学者な者で・・・・
melian

2021/11/15 15:10

BeautifulSoup の方は単なる文字列ではなくて、HTML のタグや内部のテキストなどを解析した結果を入れているオブジェクトになっています。そのため、re.search による検索はそのままではできません。その代わり、find や select といった専用のメソッドが用意されているわけです。今回の件も本来は BeautifulSoup で処理する方が良いのかもしれません。
melian

2021/11/15 15:40

ごめんなさい、str() で文字列に変換できました。 contents = soup.find("section" , class_="post-content") text = str(contents) でも OK です。
onodesu

2021/11/15 15:45

ありがとうございます! ほんとですね!私もできました! ご丁寧に教えていただき本当にありがとうございました。
guest

0

xmlの類いを自力でやるのは大変です。
BeautifulSoupを使うとこういう感じです。

python

1>>> from bs4 import BeautifulSoup 2>>> 3>>> text = '''<section class="post-content" itemprop="text"> 4... あいうえお 5... かきくけこ 6... <h3>ABCD</h3> 7... </section>''' 8>>> 9>>> soup = BeautifulSoup(text) 10>>> print(next(soup.stripped_strings)) 11あいうえお 12かきくけこ

投稿2021/11/15 12:34

ppaul

総合スコア24670

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問