🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python 3.x

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

Q&A

解決済

1回答

1704閲覧

python 一部のhref属性を順に置換したいです

kero16

総合スコア9

Python 3.x

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

0グッド

0クリップ

投稿2019/11/25 04:48

前提・実現したいこと

一部のhref属性を、リストの順に置換していきたいです。

BeautifulSoupと正規表現で置換したいhref属性を取得できたのですが
リストを参照し、順に置換する方法がわかりません。
(replaceやsubを使い、ひとつのhref属性を置換する方法はわかったのですが
順に置換ができませんでした)

※置換する対象のhref属性
・クラス名がsample
・できれば、https://www.change.com/◯◯/testの◯◯のみ置換

教えていただけましたら幸いです。よろしくお願いいたします。

該当のソースコード

html

1<!-- リスト link_after = ['after_ABC', 'after2_AB', 'after_045']--> 2 3<body> 4 5<a href="https://www.nochange.com/"></a> <!-- →変更しない --> 6 7<div class="sample"> 8 <a href="https://www.change.com/before_a/test"></a> <!-- →https://www.change.com/リスト[0]/test に変更--> 9</div> 10<div class="sample"> 11 <a href="https://www.change.com/before_b/test"></a><!-- →https://www.change.com/リスト[1]/test に変更--> 12</div> 13<div class="sample"> 14 <a href="https://www.change.com/before_c/test"></a><!-- →https://www.change.com/リスト[2]/test に変更--> 15</div> 16 17<a href="https://www.none.com/"></a><!-- →変更しない --> 18 19</body>

python

1import re 2from bs4 import BeautifulSoup 3 4html = 'text.html' 5pattern = r'https://www.change.com/(.+)/test' 6link_after = ['after_ABC', 'after2_AB', 'after_045'] 7 8soup = BeautifulSoup(open(html, encoding='utf-8'), 'html.parser') 9 10for x in soup.select('.sample a'): 11 link_before = x.get('href') 12 mo = re.findall(pattern, link_before)

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

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

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

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

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

guest

回答1

0

ベストアンサー

置換後の文字列のリストもタグの一覧と一緒に zip() でループさせればいいと思います。

python

1import re 2from bs4 import BeautifulSoup 3 4html = "sample.html" 5pattern = r"(https://www.change.com/).+(/test)" 6link_after = ["after_ABC", "after2_AB", "after_045"] 7 8soup = BeautifulSoup(open(html, encoding="utf-8"), "html.parser") 9 10for a_tag, after in zip(soup.select(".sample a"), link_after): 11 a_tag["href"] = re.sub(pattern, fr"\1{after}\2", a_tag["href"]) 12print(soup) 13 14# <!-- リスト link_after = ['after_ABC', 'after2_AB', 'after_045']--> 15# <body> 16# <a href="https://www.nochange.com/"></a> <!-- →変更しない --> 17# <div class="sample"> 18# <a href="https://www.change.com/after_ABC/test"></a> <!-- →https://www.change.com/リスト[0]/test に変更--> 19# </div> 20# <div class="sample"> 21# <a href="https://www.change.com/after2_AB/test"></a><!-- →https://www.change.com/リスト[1]/test に変更--> 22# </div> 23# <div class="sample"> 24# <a href="https://www.change.com/after_045/test"></a><!-- →https://www.change.com/リスト[2]/test に変更--> 25# </div> 26# <a href="https://www.none.com/"></a><!-- →変更しない --> 27# </body>

投稿2019/11/25 08:34

tiitoi

総合スコア21956

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

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

kero16

2019/11/25 09:19

無事できました! zip()だけではなく、fr(f-stringsのraw文字列との組み合わせ?)も初めて知りました。 大変勉強になりました。 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問