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

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

詳細はこちら
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

Q&A

解決済

2回答

2019閲覧

pythonを使ってPDFファイルからデータを抽出したい

samankoar

総合スコア7

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

データマイニング

データマイニングは、購買履歴やクレジットカードの利用履歴、電話の通話履歴など企業にある大量のデータを解析して、その中に隠れたパターンやルールを探し出す技術です。DMと略されることもあります。

0グッド

0クリップ

投稿2021/02/23 13:35

編集2021/02/23 13:37

初めてスクラピングやっています
このURL [https://www.jpx.co.jp/listing/stocks/new/nlsgeu000005bzt3-att/03Broad-Minded-Outline.pdf]のデータを表に入れ込みたいです。仕事上で頻繁にやる作業なので自動化をはかりたい。

python

1import pdfplumber 2import re 3import requests 4from bs4 import BeautifulSoup 5from datetime import datetime as dt 6import pandas as pd 7 8url = 'https://www.jpx.co.jp/listing/stocks/new/nlsgeu000005bzt3-att/03Broad-Minded-Outline.pdf' 9 10def download_file(url): 11 local_filename = url.split('/')[-1] 12 13 with requests.get(url) as r: 14 with open(local_filename, 'wb') as f: 15 f.write(r.content) 16 17 return local_filename 18 19ap = download_file(url) 20ap 21 22with pdfplumber.open(ap) as pdf: 23 page = pdf.pages[0] 24 text = page.extract_text() 25 26print(text) 27 28for line in text.split('\n'): 29 print(line) 30 el_num = line.split() 31 print(el_num)

ここまで何とかググりながらたどり着いたが、この後はもうわかりません。ヒントなど教えていただければと思います。
例えば 最初の行を二つのセルに分けたいです

  1. 会 社 名 2. ブロードマインド株式会社

2列のデータフレームを作れたらいいと思います

splitをかけた後、1文字づつになっているものが1列目 複数で一塊になっているのが2列目でしょうがreの使い方をイマイチわからない

どうぞよろしくお願いします

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

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

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

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

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

guest

回答2

0

ベストアンサー

中点が文字化けするので、手抜きの処理です。

python

1import pdfplumber 2import re 3import requests 4import pandas as pd 5 6items = '''会 社 名 7( 英 訳 名 ) 8上 場 予 定 日 9市 場 区 分 10既 上 場 市 場 11代 表 者 の 役 職 氏 名 12本 店 所 在 地 13Tel 14(最寄りの連絡場所) 15ホームページアドレス 16設 立 年 月 日 17事 業 の 内 容 18業 種 別 分 類.*コ ー ド 19銘 柄 略 称 20銘 柄 順 位 21発 行 可 能 株 式 総 数 22発 行 済 株 式 総 数 23上場時発行済株式総数 24資 本 金 251 単 元 の 株 式 数 26事 業 年 度 27定 時 株 主 総 会 28基 準 日 29剰余金の配当の基準日 30株 主 名 簿 管 理 人 31監 査 人 32幹 事 取 引 参 加 者''' 33 34item_list = items.split('\n') 35item_list2 = item_list.copy() 36item_list2[12] = '業 種 別 分 類 コ ー ド' 37 38url = 'https://www.jpx.co.jp/listing/stocks/new/nlsgeu000005bzt3-att/03Broad-Minded-Outline.pdf' 39 40def download_file(url): 41 local_filename = url.split('/')[-1] 42 with requests.get(url) as r: 43 with open(local_filename, 'wb') as f: 44 f.write(r.content) 45 return local_filename 46 47ap = download_file(url) 48ap 49 50with pdfplumber.open(ap) as pdf: 51 page = pdf.pages[0] 52 text = page.extract_text() 53 54#print(text) 55 56i = 0 57contents = [] 58for line in text.split('\n')[4:]: 59 item = item_list[i] 60 m = re.match('('+item_list[i]+')(.+)', line) 61 if m: 62 contents.append([m.groups()[1].strip()]) 63 i = i+1 64 if i >= len(item_list): 65 break 66 else: 67 contents[-1].append(line.strip()) 68 69df = pd.DataFrame({'items':item_list2, 'contents':['\n'.join(x) for x in contents]})

実行結果は以下です。

python

1>>> print(df) 2 items contents 30 会 社 名 ブロードマインド株式会社 41 ( 英 訳 名 ) (Broad-Minded Co.,Ltd.52 上 場 予 定 日 202132663 市 場 区 分 マザーズ 74 既 上 場 市 場 なし 85 代 表 者 の 役 職 氏 名 代表取締役社長 伊藤 清 96 本 店 所 在 地 〒1500022 東京都渋谷区恵比寿南一丁目55107 Tel 0368598358 118 (最寄りの連絡場所) (同上) 129 ホームページアドレス https://www.b-minded.com/ 1310 設 立 年 月 日 2002191411 事 業 の 内 容 個人及び法人向けに保険代理店業、住宅ローン代理業、金融商品仲介\n業、宅地建物取引業に係るソ... 1512 業 種 別 分 類 コ ー ド 保険業・7343(新証券コード(ISIN)JP3831510007) 1613 銘 柄 略 称 M-ブロードマインド 1714 銘 柄 順 位 M-アイペットHDの次位 1815 発 行 可 能 株 式 総 数 18,280,0001916 発 行 済 株 式 総 数 4,570,000株(2021219日現在) 2017 上場時発行済株式総数 5,170,000株\n(注)1.公募分を含む。\n2.新株予約権の権利行使により増加する可... 2118 資 本 金 283,790千円(2021219日現在) 2219 1 単 元 の 株 式 数 1002320 事 業 年 度 41日から3312421 定 時 株 主 総 会 毎事業年度終了後3ヵ月以内 2522 基 準 日 3312623 剰余金の配当の基準日 930日、3312724 株 主 名 簿 管 理 人 三菱UFJ信託銀行㈱ 2825 監 査 人 太陽有限責任監査法人 2926 幹 事 取 引 参 加 者 みずほ証券㈱

投稿2021/02/23 15:41

ppaul

総合スコア24670

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

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

samankoar

2021/02/24 10:00

@ppaul ご回答ありがとうございました。確かにdfとして出てきました。ただ最初のitemsをどうとればいいのかわからないです。同じサイトの英語版、例えば https://www.jpx.co.jp/english/listing/stocks/new/b5b4pj000003yozk-att/03Broad-Minded-OutlineEN.pdf にitemsの作成に苦節しています。変なとこに改行があったり…単純に i = 0 contents = [] for line in text.split('\n’)[6:]: item = item_list[i] m = re.match('('+item_list[i]+')(.+)', line) if m: contents.append([m.groups()[1].strip()]) i = i+1 if i >= len(item_list): break else: contents[-1].append(line.strip()) df = pd.DataFrame({'items':item_list2, 'contents':['\n'.join(x) for x in contents]}) でいけません。またもアドバイス頂ければありがたいです
guest

0

天下の日本取引所が提出させるデータ。
どの法人を見てもフォーマットはきっちり固まってるみたい(どの項目が並んでいるか、が法人によりほとんどバラつきがない)なんで、
まずは
coporation = line.replace("会 社 名","").lstrip()

とかでちまちまやった方が楽なんじゃないでしょうか。

投稿2021/02/23 14:57

編集2021/02/23 15:23
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問