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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Beautiful Soup

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

Python

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

Q&A

解決済

2回答

761閲覧

BeautifulSoup で 特定のタグ内のaタグのみを重複せずに1つ抽出したい

dub

総合スコア23

Beautiful Soup

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

Python

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

0グッド

0クリップ

投稿2021/10/27 11:23

商品一覧ページそれぞれの個別ページに遷移してスクレイピングしたいと思っています。

ただ該当のページがclass や idが少ないので、色々な方法で試みるのですが、思ったような結果になりません。

下記のようなソースページからタグで特定して tbody 内の dd 内の aタグを特定したいです。

html スクレイピング元

1<tbody> 2 <tr class layout="list"> 3 <td> 4 <dt class="vm"> 5 <a href="/item/1001"> 6 <span class="thumb"> 7 <img src=''> 8 </span> 9 </dt> 10 <dd> 11 <div class="small"> </div> 12 <div> 13 <a href="/item/1001" class>商品1</a> 14 </dd> 15 </td> 16</tr> 17 18 <tr class layout="list"> 19 <td> 20 <dt class="vm"> 21 <a href="/item/1002"> 22 <span class="thumb"> 23 <img src=''> 24 </span> 25 </dt> 26 <dd> 27 <div class="small"> </div> 28 <div> 29 <a href="/item/1002" class>商品2</a> 30 </dd> 31 </td> 32</tr> 33 34 <tr class layout="list"> 35 <td> 36 <dt class="vm"> 37 <a href="/item/1003"> 38 <span class="thumb"> 39 <img src=''> 40 </span> 41 </dt> 42 <dd> 43 <div class="small"> </div> 44 <div> 45 <a href="/item/1003" class>商品3</a> 46 </dd> 47 </td> 48</tr> 49</tbody> 50 51<div class="box"> 52 <dt class="vm"> 53 <a href="/item/1004"> 54 <span class="thumb"> 55 <img src=''> 56 </span> 57 </dt> 58 <dd> 59 <div class="small"> </div> 60 <div> 61 <a href="/item/1004">商品4</a> 62 </dd> 63 64 <dt class="vm"> 65 <a href="/item/1005"> 66 <span class="thumb"> 67 <img src=''> 68 </span> 69 </dt> 70 <dd> 71 <div class="small"> </div> 72 <div> 73 <a href="/item/1005">商品5</a> 74 </dd> 75 76</div>

やった事 tbodyで要素抽出した後でリンクを抽出できるが、同じタグが2つあるので、2つずつ抽出してしまう。

python

1tbody_links= soup.find_all('tbody')[0].find_all(href=re.compile("/item/")) 2pickup_links = [elem.attrs['href'] for elem in tbody_links] 3pickup_links 4#/item/1001 (2つずつしか抽出できない) 5#/item/1001 6#/item/1002 7#/item/1002 8#/item/1003 9#/item/1003 10

注意点
dt や dd で抽出してしまうと tbody 以外のリンク(item/1004,item/1005も抽出してしまいます

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

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

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

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

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

guest

回答2

0

CSS selector を使ってみました。

python

1pickup_links = [elem['href'] for elem in soup.select('tbody dd a')] 2pickup_links 3 4['/item/1001', '/item/1002', '/item/1003']

投稿2021/10/27 12:44

melian

総合スコア19865

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

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

dub

2021/10/27 23:43

ありがとうございます!出来ました。なるほど、CSSセレクターで このように出来るんですね。今回2つ回答を頂いて、それぞれ違う角度からの解決法で非常に勉強になりました。ベストアンサーは最初に頂いた方にしましたが、本当にありがとうございます!
guest

0

ベストアンサー

複雑なことは考えずに、順番に取りだしてみました。

python

1>>> tbody_links = soup.find('tbody').find_all('dd') 2>>> pickup_links = [elem.find('a').get('href') for elem in tbody_links] 3>>> pickup_links 4['/item/1001', '/item/1002', '/item/1003']

投稿2021/10/27 12:01

ppaul

総合スコア24666

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

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

dub

2021/10/27 23:41

ありがとうございます!できました。二行目 for文で取り出した要素に対してもelem.find が出来るんですね。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問