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

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

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

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

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

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

3回答

2812閲覧

beautifulsoup4 で a hrefの要素を抜き出したい

TheBullchannel

総合スコア33

スクレイピング

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

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

Beautiful Soup

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

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2019/08/31 08:01

python3 でスクレイピングを練習しております。

https://kabuoji3.com/stock/9913/

上記のサイトの年数を取得したいです。
beautifulsoupを使用して取得しようと試みましたが、うまくいきません。

以下、試作したコードになります。
よろしくお願いします。
import pandas as pd
import csv
from bs4 import BeautifulSoup
import requests

df = pd.read_csv('code1.csv')

for i in range(len(df)):
url1 = 'https://kabuoji3.com/stock/{}/'.format(df.iat[i, 0])
html = requests.get(url1)
soup = BeautifulSoup(html.content,'lxml')
print(soup.find("span",class_="jp").string)
print(soup.find_all("ul", class_="stock_yselect mt_10"))

イメージ説明
イメージ説明

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

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

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

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

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

meg_

2019/08/31 08:29

コードは「コードの挿入」で記入してください。 あと、'code1.csv'とは何ですか?
TheBullchannel

2019/09/01 11:37

code1.csv は証券コードをまとめたリストで、これを読み込んで特定のリンクにアクセスするものとなっております。 直近300日の取り除き方についてですが、うまくできません。 if  in を使って、直近300日を取り除こうかと思いましたが失敗しました。 次にfor year in years: 内で、新たな変数aを1ずつ加算して行き、a = 0の時だけ無視するという感じでやってみましたが、挙動が想像していたものと異なります。 for文で1行ずつ2019、2018、2017~と出力されていると思っておりましたが、一気にまとめて表示されているようです。
meg_

2019/09/01 11:57

検証したところ、私のやり方では文字列に改行コードが含まれてしまいますね。 namnium1125さんのやり方の方が良いですね。ベストアンサーは取り消せますので。 下記のように必要な情報をリストにすると後で使いやすいです。 year_list = [] for ul in soup.find_all("ul", class_="stock_yselect mt_10"): for a in ul.find_all("a"): if a.decode_contents(formatter="html") != "直近300日": year_list.append(a.decode_contents(formatter="html")) print(year_list)
TheBullchannel

2019/09/01 12:42

ありがとうございます! namnium様の方法で試したところ、無事にURLに2019、2018と代入することができました。 加えてmeg様の方法でif 文を実装したところ、希望の動作になりました。大変感謝いたします!
guest

回答3

0

ベストアンサー

Python

1soup.find_all("ul", class_="stock_yselect mt_10")

ここまで取れているので、テキストを取得すれば良いかと思います。

Python

1years = soup.find_all("ul", class_="stock_yselect mt_10") 2for year in years: 3 print(year.text)

但し、一部余分な情報(直近300日など)も取れてしまうので後処理してください。

投稿2019/08/31 08:58

meg_

総合スコア10577

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

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

0

decode_contents を使えば innerHTML を取ることができるそうです。

[Python] BeautifulSoup4で、innerHTMLとouterHTMLの取得 - YoheiM .NET

csv ファイルを取ってくるのが面倒だったため少し簡略化しましたが、例えば以下のように書けました。

Python

1# import pandas as pd 2# import csv 3from bs4 import BeautifulSoup 4import requests 5 6# df = pd.read_csv('code1.csv') 7 8# for i in range(len(df)): 9# url1 = 'https://kabuoji3.com/stock/{}/'.format(df.iat[i, 0]) 10url1 = 'https://kabuoji3.com/stock/9913/' 11html = requests.get(url1) 12soup = BeautifulSoup(html.content,'lxml') 13print(soup.find("span",class_="jp").string) 14# print(soup.find_all("ul", class_="stock_yselect mt_10")) 15for ul in soup.find_all("ul", class_="stock_yselect mt_10"): 16 for a in ul.find_all("a"): 17 print(a.decode_contents(formatter="html"))

投稿2019/08/31 08:26

namnium1125

総合スコア2043

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

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

0

pandas.read_htmlで取得した表の結合ができない

beautifulsoupで直接URLを抽出したほうがよくないでしょうか?

python

1import pandas as pd 2import requests 3from bs4 import BeautifulSoup 4 5url = 'https://kabuoji3.com/stock/1305/' 6 7r = requests.get(url) 8 9soup = BeautifulSoup(r.content, 'lxml') 10 11dfs = [] 12 13for i in soup.select( 14 'div#base_box > div.base_box_body > ul[class="stock_yselect mt_10"] > li > a' 15): 16 if i.get_text(strip=True) != "直近300日": 17 dfs.extend(pd.read_html(i.get("href"))) 18 19df = pd.concat(dfs[::-1], ignore_index=True)

投稿2019/09/02 08:18

barobaro

総合スコア1286

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問