<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Python &#8211; まったりエンジニア</title>
	<atom:link href="https://javeo.jp/category/python/feed/" rel="self" type="application/rss+xml" />
	<link>https://javeo.jp</link>
	<description>ほどほどレベルのプログラミング</description>
	<lastBuildDate>Wed, 12 Aug 2026 13:30:48 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0.4</generator>

<image>
	<url>https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2-32x32.png</url>
	<title>Python &#8211; まったりエンジニア</title>
	<link>https://javeo.jp</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Pythonの文字化けが消える UTF-8既定化とは</title>
		<link>https://javeo.jp/python-utf8-default/</link>
					<comments>https://javeo.jp/python-utf8-default/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 05 Jul 2026 11:54:27 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[初心者]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4917</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/07/python-utf8-default-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>PythonでファイルをopenするとUnicodeDecodeError cp932が出て文字化けする原因を、Windowsのcp932の仕組みから初心者向けに解説します、今できるencoding指定やPYTHONUTF8の対策、そしてPython 3.15のUTF-8既定化(PEP 686)で何が変わるのかまで一通り整理しました(2026年7月時点)]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/07/python-utf8-default-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">PythonでテキストやCSVを読み込もうとしたら、いきなり<strong>UnicodeDecodeError</strong>が出てファイルが開けなかった経験はありませんか？</p>



<p class="wp-block-paragraph">この文字化けエラーは、Windowsで<strong>cp932</strong>という日本語向けの文字コードが使われているのが原因です<br>MacやLinuxではあまり見かけないのに、Windowsだと急に出てくる、あの厄介なやつです</p>



<p class="wp-block-paragraph">この記事では、まずなぜWindowsで文字化けが起きるのかをほどいてから、今すぐできる対策を整理します<br>そのうえで、<strong><span class="swl-marker mark_yellow">Python 3.15のUTF-8既定化(PEP 686)</span></strong>で、この悩みがどう変わる見込みなのかまで、初心者の方向けに広く浅くまとめていきます</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>文字化けは、原因が分かると対策もすっきり見えてきます</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">この記事は<strong>2026年7月時点</strong>の情報でまとめています<br>Python 3.15はまだ正式リリース前(beta段階)で、正式版は<strong>2026年10月1日</strong>予定です、仕様は固まっていますが細かい文言は変わる可能性があります</p>
</div></div>



<h2 class="wp-block-heading">Pythonの文字化けがWindowsで起きる理由(cp932)</h2>



<p class="wp-block-paragraph">結論から言うと、Windowsで文字化けが起きるのは、encodingを指定せずにファイルを開くと<strong><span class="swl-marker mark_yellow">Windowsの既定の文字コードcp932</span></strong>で読もうとするからです<br>そのファイルがUTF-8で保存されていると、cp932では解釈できないバイトが出てきてエラーになる、という流れです</p>



<p class="wp-block-paragraph">Pythonの公式ドキュメントには、テキストモードでencodingを指定しない場合、使われるエンコーディングはOSに依存すると書かれています<br>Pythonが内部で今のロケール(地域・言語の設定)に合わせた文字コードを取りに行くので、その結果がプラットフォームによって変わるわけです</p>



<p class="wp-block-paragraph">日本語Windowsの場合、この既定の文字コードが<strong>cp932</strong>になります<br>だから「encodingを書かずにopenする」と、暗黙のうちにcp932で読もうとして、UTF-8のファイルで転ぶんです</p>



<h3 class="wp-block-heading">MacやLinuxで文字化けが起きにくいのはなぜか</h3>



<p class="wp-block-paragraph">MacやLinuxのようなUnix系のシステムは、ロケールがUTF-8になっていることが多いです<br>だから既定の文字コードもUTF-8寄りで、UTF-8のファイルをそのまま開いても問題が起きにくいんです</p>



<p class="wp-block-paragraph">「同じコードなのに、自分のWindowsだと落ちて、同僚のMacだと動く」というすれ違いは、この既定の文字コードの違いから来ています<br>ただ、MacやLinuxも設定次第ではUTF-8以外になることがあるので、「Unix系なら100%大丈夫」とまでは言い切れません</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>Windowsだけ挙動が違うのは、地域設定の名残なんです</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h3 class="wp-block-heading">cp932はShift_JISとは別物です</h3>



<p class="wp-block-paragraph">ここで1つ、混同しやすいポイントを押さえておきます<br><strong>cp932とShift_JISは、似ているけれど同じではありません</strong></p>



<p class="wp-block-paragraph">cp932は、標準のShift_JISをマイクロソフトがWindows向けに拡張したものです<br>漢字やひらがなの部分は同じなのですが、丸数字の①のような記号は、Shift_JISとcp932で割り当てられている値が違います</p>



<p class="wp-block-paragraph">だからWindowsで作られたファイルを読むときは、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">encoding=&#8221;shift_jis&#8221;ではなくencoding=&#8221;cp932&#8243;</span></strong>を指定するのが安全です<br>shift_jisを指定すると、記号のところで文字化けやエラーが起きることがあります</p>



<p class="wp-block-paragraph">やっかいなのは、漢字やひらがなが多い文章だと、shift_jisでもそれっぽく読めてしまう場面があることです<br>普段は問題なく動いていて、丸数字やローマ数字が入ったデータが来たときだけ急に転ぶ、という気づきにくい落とし穴になります</p>



<p class="wp-block-paragraph">Windows由来と分かっているファイルは、はじめから<strong>cp932</strong>を指定しておくのが無難です<br>そうしておけば、拡張された記号が混じっていても取りこぼしなく読めます</p>



<h2 class="wp-block-heading">UnicodeDecodeErrorの読み方を覚える</h2>



<p class="wp-block-paragraph">まずは実際にエラーを再現してみます<br>UTF-8で保存したファイルを、encodingを指定せずに開くと、Windowsでは次のようなエラーが出ます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># UTF-8で保存された data.txt を、encodingを書かずに開く
with open("data.txt") as f:
    text = f.read()

# ↓ Windowsだと、こんなエラーが出る
# UnicodeDecodeError: 'cp932' codec can't decode byte 0xef in position 0:
# illegal multibyte sequence</code></pre></div>



<p class="wp-block-paragraph">長くて身構えてしまうエラーですが、読む場所は3つだけです<br>この3か所さえ拾えれば、原因のあたりが付けやすくなります</p>



<figure class="wp-block-table is-style-stripes"><table><thead><tr><th>読む場所</th><th>意味</th></tr></thead><tbody><tr><td><strong>&#8216;cp932&#8217; codec</strong></td><td>どの文字コードで読もうとして失敗したか(ここではcp932)</td></tr><tr><td><strong>byte 0xef</strong></td><td>どのバイトでつまずいたか</td></tr><tr><td><strong>position 0</strong></td><td>ファイルの何バイト目でつまずいたか(0=先頭)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">この例では先頭がBOMなので、<strong>position 0の0xef</strong>はUTF-8のBOMという印の先頭バイトになっています<br>cp932で読もうとしたら、いきなり1バイト目で「知らないバイトだ」となって転んだ、というわけです</p>



<p class="wp-block-paragraph">BOMが無いファイルでも、日本語が先頭付近にあれば同じ種類のエラーが出ます<br>その場合はpositionが0以外の数字になって、日本語の1文字目のバイトでつまずいた、という読み方になります</p>



<p class="wp-block-paragraph">末尾の<strong>illegal multibyte sequence</strong>は「cp932にない、ありえないバイトの並び」という意味です<br>ファイルが途中で切れているときは<strong>incomplete multibyte sequence</strong>(不完全なバイト列)と出ることもあります</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>codec名を見れば、どの文字コードで読もうとしたか一発で分かります</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">今すぐできる文字化け対策4つと効き方の違い</h2>



<p class="wp-block-paragraph">Python 3.15を待たなくても、今のバージョンで打てる対策があります<br>大きく4つあって、それぞれ「どこに効くか」が違うので、そこを押さえておくと迷いません</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:800px;"><thead><tr><th>対策</th><th>何に効くか</th><th>効かない範囲</th></tr></thead><tbody><tr><td><strong>encoding明示</strong></td><td>自分が書いたopen()のファイル読み書き</td><td>ライブラリの中で開いているファイル</td></tr><tr><td><strong>PYTHONUTF8=1</strong></td><td>プロセス全体(ライブラリ含む)のopen既定とprint側</td><td>encodingを明示した箇所は明示が優先</td></tr><tr><td><strong>-X utf8</strong></td><td>起動時にUTF-8モードを有効化(効果はPYTHONUTF8=1と同じ)</td><td>同上</td></tr><tr><td><strong>PYTHONIOENCODING</strong></td><td>一般に標準入出力(printや入力)側のエンコーディング</td><td>open()のファイル既定には及ばないとされる</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">対策1 open()にencodingを明示する(一番のおすすめ)</h3>



<p class="wp-block-paragraph">最優先の対策は、open()に<strong>encoding</strong>を書くことです<br>「どの文字コードで読むか」を自分で指定してしまえば、OSの既定に左右されなくなります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># UTF-8のファイルを読む(基本形)
with open("data.txt", encoding="utf-8") as f:
    text = f.read()

# ExcelなどでできたBOM付きUTF-8のファイルは utf-8-sig で
# (先頭に見えないゴミ文字が残らない)
with open("data.csv", encoding="utf-8-sig") as f:
    text = f.read()

# Windows由来のcp932のファイルなら cp932 を指定
with open("windows.csv", encoding="cp932") as f:
    text = f.read()</code></pre></div>



<p class="wp-block-paragraph">Pythonの公式も、バージョン間で挙動をそろえるために<strong>encodingを常に明示すること</strong>を推奨しています<br>ただしこれが効くのは自分のコードのopen()だけで、使っているライブラリが内部で開くファイルまでは面倒を見きれません</p>



<h3 class="wp-block-heading">対策2 PYTHONUTF8=1 でUTF-8モードにする</h3>



<p class="wp-block-paragraph">環境変数<strong>PYTHONUTF8=1</strong>を設定すると、UTF-8モードが有効になります<br>このモードでは、open()の既定がUTF-8になり、標準入出力もUTF-8寄りになります</p>



<p class="wp-block-paragraph">コマンドプロンプトでその場だけ有効にするなら、次のように打ってからPythonを動かします</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-powershell" data-lang="Command Prompt"><code>set PYTHONUTF8=1
python your_script.py</code></pre></div>



<p class="wp-block-paragraph">いつも有効にしておきたいなら、Windowsのシステム環境変数に<strong>PYTHONUTF8</strong>を追加して値を<strong>1</strong>にしておく手もあります<br>この方法はencoding明示と違って、<strong><span class="swl-marker mark_yellow">ライブラリが内部で開くファイルにも効く</span></strong>のが強みです</p>



<h3 class="wp-block-heading">対策3 python -X utf8 で起動時に有効化する</h3>



<p class="wp-block-paragraph">環境変数をいじらず、その起動だけUTF-8モードにしたいときは、起動オプション<strong>-X utf8</strong>が使えます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-powershell" data-lang="Command Prompt"><code>python -X utf8 your_script.py</code></pre></div>



<p class="wp-block-paragraph">効果はPYTHONUTF8=1と同じで、UTF-8モードをオンにします<br>「この実行のときだけ試したい」という場面で手軽です</p>



<h3 class="wp-block-heading">対策4 PYTHONIOENCODING はprint側の対策</h3>



<p class="wp-block-paragraph">環境変数<strong>PYTHONIOENCODING</strong>は、標準入出力の文字コードを指定するものです<br>コンソールへのprintで文字化けする(UnicodeEncodeErrorが出る)ときの対処として、一般によく使われます</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">PYTHONIOENCODINGは<strong>print側(標準入出力)</strong>向けで、open()のファイル既定には及ばないとされています<br>ファイルの文字化けはencoding明示かPYTHONUTF8、コンソールのprintはPYTHONIOENCODING、と役割を分けて考えると混乱しません</p>
</div></div>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>迷ったら、まずopen()にencodingを書くところから始めれば大丈夫です</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">pandasやcsvでファイルを読むときの文字化け対策</h2>



<p class="wp-block-paragraph">ここまではopen()の話でしたが、実務ではpandasの<strong>read_csv</strong>や標準ライブラリの<strong>csv</strong>でファイルを読む場面も多いと思います<br>この2つも文字化けの考え方は同じで、要は「どの文字コードで読むか」をこちらから指定してあげればいいだけです</p>



<h3 class="wp-block-heading">pandas.read_csv は encoding 引数で指定する</h3>



<p class="wp-block-paragraph">pandasでCSVを読むときも、<strong>encoding</strong>を渡せば文字化けを防げます<br>渡し方はopen()とほぼ同じで、ファイルの中身に合わせてUTF-8かcp932を選びます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import pandas as pd

# UTF-8のCSVを読む(基本形)
df = pd.read_csv("data.csv", encoding="utf-8")

# Excelで「CSV UTF-8」保存したBOM付きは utf-8-sig で
df = pd.read_csv("excel_utf8.csv", encoding="utf-8-sig")

# Excelで「CSV(コンマ区切り)」保存したcp932は cp932 で
df = pd.read_csv("excel_export.csv", encoding="cp932")</code></pre></div>



<p class="wp-block-paragraph">読み方の見分け方はopen()のときと同じで、<strong>Excel由来のCSVはcp932かutf-8-sigのどちらか</strong>だと思っておけば、たいていのケースはカバーできます<br>どちらか分からないときは、両方を試してエラーにならない方を選ぶのが手っ取り早いです</p>



<h3 class="wp-block-heading">標準の csv モジュールは open() の encoding に従う</h3>



<p class="wp-block-paragraph">標準ライブラリの<strong>csv</strong>モジュールは、少し立ち位置が違います<br>csv自身に文字コードの指定はなく、先に<strong>open()で開いたファイル</strong>を渡す形なので、文字コードはそのopen()のencodingで決まります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import csv

# 文字コードは open() 側の encoding で決まる
# csv.reader 自体に encoding 引数は無い
with open("data.csv", encoding="utf-8", newline="") as f:
    reader = csv.reader(f)
    for row in reader:
        print(row)</code></pre></div>



<p class="wp-block-paragraph">つまりcsvモジュールの文字化けは、結局open()にencodingを書けば防げます<br>ちなみにcsvを開くときは、改行の扱いを揃えるために<strong>newline=&#8221;&#8221;</strong>も一緒に付けるのが公式の推奨です</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">pandasは<strong>read_csvのencoding引数</strong>、標準csvは<strong>open()のencoding</strong>、と入り口は違いますが、指定する文字コードの考え方は共通です<br>UTF-8のファイルはutf-8(BOM付きはutf-8-sig)、Windows/Excel由来はcp932、という基準はそのまま使えます</p>
</div></div>



<h2 class="wp-block-heading">EncodingWarningでencoding未指定のopenを洗い出す</h2>



<p class="wp-block-paragraph">「encodingを明示するのが良いのは分かったけど、自分のコードのどこが抜けているか分からない」というときに便利な機能があります<br>それが<strong>EncodingWarning</strong>という警告です</p>



<p class="wp-block-paragraph">この警告はPython 3.10で導入されました<br>encodingを指定せずにopen()している箇所を見つけて、「ここ、既定の文字コードで開いてますよ」と教えてくれます</p>



<p class="wp-block-paragraph">ただし、デフォルトでは出ない設定になっているので、自分でオンにする必要があります<br>起動オプション<strong>-X warn_default_encoding</strong>(または環境変数<strong>PYTHONWARNDEFAULTENCODING</strong>)を付けて実行します</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-powershell" data-lang="Command Prompt"><code>python -X warn_default_encoding your_script.py</code></pre></div>



<p class="wp-block-paragraph">これを付けて動かすと、encodingを書き忘れているopen()のところで警告が出ます<br>Python 3.15への引っ越し前に、<strong><span class="swl-marker mark_yellow">直しておくべき箇所を先に洗い出せる点検ツール</span></strong>として使えます</p>



<h3 class="wp-block-heading">警告を出して1つずつencodingを足す手順</h3>



<p class="wp-block-paragraph">実際の使い方はシンプルで、警告を出して、出た場所にencodingを足す、これを繰り返すだけです<br>まずは点検したいスクリプトを、次のように警告オプション付きで動かしてみます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-powershell" data-lang="Command Prompt"><code>python -X warn_default_encoding your_script.py</code></pre></div>



<p class="wp-block-paragraph">encodingを書き忘れているopen()があると、その行を指して次のような警告が出ます<br>警告なので処理は止まらず、そのまま最後まで動きつつ、あやしい箇所だけ教えてくれます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-powershell" data-lang="実行結果"><code>your_script.py:5: EncodingWarning: 'encoding' argument not specified
  with open("data.txt") as f:</code></pre></div>



<p class="wp-block-paragraph">あとは警告が出た行を開いて、encodingを1つずつ足していきます<br>UTF-8のファイルなら<strong>encoding=&#8221;utf-8&#8243;</strong>、Windows由来なら<strong>encoding=&#8221;cp932&#8243;</strong>という具合に、そのファイルに合う文字コードを書き足します</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 修正前(警告が出る)
with open("data.txt") as f:
    text = f.read()

# 修正後(encodingを足す)
with open("data.txt", encoding="utf-8") as f:
    text = f.read()</code></pre></div>



<p class="wp-block-paragraph">もう一度<strong>-X warn_default_encoding</strong>付きで動かして、警告がゼロになれば点検完了です<br>この作業をひととおり済ませておけば、Python 3.15で既定が変わっても、あわてる箇所がほぼ無くなります</p>



<p class="wp-block-paragraph">ちなみに、あえてOSの既定の文字コードで開きたい箇所があるなら、<strong>encoding=&#8221;locale&#8221;</strong>と書けます<br>こう書いておくと「意図してロケール依存にしている」と伝わって、警告も出なくなります</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>


<h2 class="wp-block-heading">Python 3.15のUTF-8既定化(PEP 686)で何が変わるのか</h2>



<p class="wp-block-paragraph">ここからが本題です<br>Python 3.15では<strong>PEP 686</strong>という提案が採用され、<strong><span class="swl-marker mark_yellow">既定の文字コードがOSの環境に関係なくUTF-8になる見込み</span></strong>です</p>



<p class="wp-block-paragraph">What&#8217;s New(新機能のまとめ)にも「Pythonはシステムの環境に関係なくUTF-8を既定のエンコーディングとして使う」と書かれています<br>これが実現すると、Windowsでも<strong>open(&#8220;data.txt&#8221;)</strong>のようにencodingを書かずに開いたとき、UTF-8で読んでくれるようになります</p>



<h3 class="wp-block-heading">正体はUTF-8モードを既定でオンにすること</h3>



<p class="wp-block-paragraph">1つ大事な点があります<br>PEP 686は「既定のエンコーディングだけをUTF-8に差し替える」ものではなく、<strong><span class="swl-marker mark_yellow">先ほどのUTF-8モードそのものを、既定でオンにする</span></strong>という内容です</p>



<p class="wp-block-paragraph">だから変わるのはopen()の既定だけではありません<br>UTF-8モードは標準入出力にも及ぶので、<strong>print側の文字化けも減る方向</strong>になります(ただしコンソール側の設定にも左右されるので環境次第です)</p>



<p class="wp-block-paragraph">読者の方向けにざっくり言うと「open()の既定がUTF-8になって、printまわりも改善する」と捉えておけば十分です<br>PEP 686はもともとmethaneさん(Inada Naokiさん)が2022年に提案したもので、長く予告されてきた変更でもあります</p>



<h3 class="wp-block-heading">2026年10月に正式リリース予定(今はまだbeta)</h3>



<p class="wp-block-paragraph">気をつけたいのは、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">Python 3.15はまだ正式リリースされていない</span></strong>という点です<br>2026年7月時点ではbeta段階で、正式版(3.15.0)は<strong>2026年10月1日</strong>予定です</p>



<p class="wp-block-paragraph">ただ、機能追加を締め切る<strong>feature freeze</strong>は2026年5月に済んでいます<br>だから「UTF-8既定化を入れる」という方針そのものは、ほぼ確定と考えて良い状態です</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">実はドキュメントには、まだ更新が追いついていない部分があります<br>What&#8217;s Newは「UTF-8が既定」と書いている一方で、open()のリファレンスは今も「ロケール依存」のままです、これは修正が進行中で、3.15がまだ動いている最中という証拠でもあります</p>
</div></div>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「もう文字化けが消えた」ではなく「これから消える見込み」という段階です</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">逆に注意 Excel由来のcp932 csvには encoding=&#8221;cp932&#8243; が必要になる</h2>



<p class="wp-block-paragraph">ここで、うっかりすると新しく踏む罠があります<br><strong>UTF-8にすれば全部解決、というわけではない</strong>んです</p>



<p class="wp-block-paragraph">3.15より前は「UTF-8のファイルをcp932で読もうとして失敗」という文字化けでした<br>ところが3.15以降は、逆に<strong><span class="swl-marker mark_yellow">cp932のファイルをUTF-8で読もうとして失敗</span></strong>する、というエラーが起こりえます</p>



<p class="wp-block-paragraph">典型例が、Excelから「CSV(コンマ区切り)」で保存したファイルです<br>日本語Windowsでこの形式で保存すると、中身はcp932になることがあります、それをencoding未指定で開くと、3.15はUTF-8で読もうとして転ぶ可能性があります</p>



<p class="wp-block-paragraph">対策は、これまでどおり<strong>encoding=&#8221;cp932&#8243;</strong>を明示することです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># Excelで「CSV(コンマ区切り)」保存したcp932のファイルを読む
# 3.15以降は encoding を書かないと、UTF-8で読もうとして失敗しうる
with open("excel_export.csv", encoding="cp932") as f:
    text = f.read()</code></pre></div>



<h3 class="wp-block-heading">ExcelのCSV UTF-8とCSVの違いを見分ける</h3>



<p class="wp-block-paragraph">Excelから保存したCSVの文字コードは、保存形式で変わります<br>保存ダイアログの「ファイルの種類」で、次のどちらを選んだかを見るのが分かりやすいです</p>



<figure class="wp-block-table is-style-stripes"><table><thead><tr><th>保存形式</th><th>だいたいの文字コード</th><th>Pythonでの読み方の目安</th></tr></thead><tbody><tr><td><strong>CSV UTF-8(コンマ区切り)</strong></td><td>UTF-8(多くはBOM付き)</td><td><strong>encoding=&#8221;utf-8-sig&#8221;</strong></td></tr><tr><td><strong>CSV(コンマ区切り)</strong></td><td>日本語Windowsではcp932になりやすい</td><td><strong>encoding=&#8221;cp932&#8243;</strong></td></tr></tbody></table></figure>



<p class="wp-block-paragraph">「CSV UTF-8」はExcel 2016以降にある比較的新しい選択肢です<br>ここはExcelのバージョンや環境で細かく変わる部分なので、うまくいかなければ両方の指定を試してみるのが手っ取り早いです</p>



<p class="wp-block-paragraph">実務では、どちらの形式で保存されたか分からないファイルを受け取る場面も多いと思います<br>そんなときは、エラーが出ても止まらずに読める書き方にしておくと、原因の切り分けが楽になります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 文字コードが分からないCSVを、順番に試して読む
for enc in ("utf-8-sig", "cp932", "utf-8"):
    try:
        with open("mystery.csv", encoding=enc) as f:
            text = f.read()
        print(f"{enc} で読めました")
        break
    except UnicodeDecodeError:
        continue</code></pre></div>



<p class="wp-block-paragraph">この書き方は、あくまで受け取ったファイルの文字コードが分からないときの応急処置です<br>自分が保存する側なら、最初から<strong>utf-8</strong>で書き出すようにそろえておくと、読むときの迷いがなくなります</p>



<p class="wp-block-paragraph">ExcelとPythonをつなぐ話は、Python本体もpipも要らずにExcelの中でPythonを動かせる<a href="https://javeo.jp/xlwings-lite/" target="_blank" rel="noopener noreferrer">xlwings Lite入門</a>でも触れています<br>ExcelのデータをPythonで扱いたい方は、あわせて読んでみてください</p>



<h2 class="wp-block-heading">従来の挙動に戻したいとき(PYTHONUTF8=0)</h2>



<p class="wp-block-paragraph">cp932前提で書かれた既存のコードを動かしていて、3.15の変更で挙動が変わって困る場面もあると思います<br>そんなときは、従来のロケール依存の挙動に<strong>戻す</strong>こともできます</p>



<p class="wp-block-paragraph">環境変数<strong>PYTHONUTF8=0</strong>、または起動オプション<strong>-X utf8=0</strong>で、UTF-8モードを無効にできます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-powershell" data-lang="Command Prompt"><code>set PYTHONUTF8=0
python your_script.py

python -X utf8=0 your_script.py</code></pre></div>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">3.15の既定切り替えは、主にWindowsのユーザーで<strong>これまでと挙動が変わる箇所</strong>が出ます<br>encodingを書かずにShift_JIS系のファイルを読み書きしていたコードは、エラーで止まるだけでなく、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">エラーも出ずに中身が壊れる</span></strong>ケースもありえます</p>
</div></div>



<p class="wp-block-paragraph">エラーで止まってくれるならまだ気づけますが、静かにデータが壊れるのが一番こわいパターンです<br>だからPYTHONUTF8=0での先送りは応急処置と考えて、原則は<strong>encodingを明示する方向</strong>で直していくのがおすすめです</p>



<h2 class="wp-block-heading">3.15移行に向けて今からやっておくこと</h2>



<p class="wp-block-paragraph">ここまでの話を、移行前の準備という形でまとめておきます<br>Python 3.15はまだ先ですが、下の4つを今のうちにやっておくと、既定が変わっても慌てずに済みます</p>



<ul style="background-color:#FFFFDC80" class="wp-block-list is-style-check_list -list-under-dashed has-background">
<li>自分のコードの<strong>open()にencodingを足す</strong>(UTF-8なら&#8221;utf-8&#8243;、BOM付きは&#8221;utf-8-sig&#8221;)</li>



<li><strong>-X warn_default_encoding</strong>で点検して、書き忘れをEncodingWarningで洗い出す</li>



<li>Excel由来の「CSV(コンマ区切り)」ファイルは<strong>encoding=&#8221;cp932&#8243;</strong>を明示しておく</li>



<li>すぐに直しきれず心配なら、しばらく<strong>PYTHONUTF8=0</strong>で従来挙動のまま様子を見る</li>
</ul>



<p class="wp-block-paragraph">ポイントは、<strong>先送り(PYTHONUTF8=0)はあくまで一時しのぎ</strong>にして、本命はencodingの明示に寄せていくことです<br>encodingさえ書いてあれば、3.15になっても3.14のままでも、同じように動いてくれます</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>今のうちにencodingを足しておけば、移行のときにやることはほぼ無くなります</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">まとめ 結局どうすればいいか</h2>



<p class="wp-block-paragraph">ここまでを整理すると、文字化けとの付き合い方はシンプルです<br>Python 3.15を待つかどうかに関わらず、<strong><span class="swl-marker mark_yellow">open()に毎回encodingを明示する</span></strong>のが、いちばん確実で長持ちする対策です</p>



<ul style="background-color:#FFFFDC80" class="wp-block-list is-style-check_list -list-under-dashed has-background">
<li>UTF-8のファイルは<strong>encoding=&#8221;utf-8&#8243;</strong>、BOM付きなら<strong>utf-8-sig</strong></li>



<li>Windows由来(Excelの「CSV」保存など)は<strong>encoding=&#8221;cp932&#8243;</strong>(shift_jisではなく)</li>



<li>ライブラリ内部まで含めて効かせたいなら<strong>PYTHONUTF8=1</strong>や<strong>-X utf8</strong></li>



<li>書き忘れの点検には<strong>-X warn_default_encoding</strong>でEncodingWarning</li>
</ul>



<p class="wp-block-paragraph">Python 3.15でUTF-8が既定になると、多くの人にとって文字化けはぐっと減る見込みです<br>ただし逆にcp932のファイルで新しい罠も生まれるので、<strong>「UTF-8にすれば全部解決」ではない</strong>という両面を覚えておくと安全です</p>



<p class="wp-block-paragraph">どちらの方向の文字化けも、結局は「どの文字コードで読むかを自分で指定しておく」ことで防げます<br>これからPythonを入れる方は、<a href="https://javeo.jp/python-install/" target="_blank" rel="noopener noreferrer">Pythonのインストール方法</a>もあわせて確認してみてください</p>



<h3 class="wp-block-heading">エラーが読めないときはClaudeに貼って聞くのもアリ</h3>



<p class="wp-block-paragraph">UnicodeDecodeErrorが出たとき、エラーメッセージをそのままClaudeに貼って聞くのも手です<br>次のような依頼テンプレートを使うと、原因の切り分けと直し方を一緒に考えてもらえます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-markdown" data-lang="依頼テンプレート"><code>PythonでファイルをopenしたらUnicodeDecodeErrorが出ました
・OS: Windows
・エラー全文:(ここにエラーをそのまま貼る)
・開こうとしているファイル:(txt / csv / どこで作ったか など)

原因の見当と、encodingの指定をどう直せばいいか教えてください
コードを書き換える場合は、変更内容を先に私に提示してから進めてください</code></pre></div>



<p class="wp-block-paragraph">最後の一文を入れておくと、勝手にファイルを書き換えられずに済みます<br>提案を確認してから自分で反映すれば、気軽に相談できます</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/python-utf8-default/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>xlwings Lite入門 Excelで動く無料Python</title>
		<link>https://javeo.jp/xlwings-lite/</link>
					<comments>https://javeo.jp/xlwings-lite/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Fri, 03 Jul 2026 23:41:28 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4880</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/07/xlwings-lite-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>Python本体もpipも要らず、Excelの中でPythonが動く無料アドインxlwings Liteを初心者向けにまとめました、pip版xlwingsやPython in Excelとの違い、できること・制約、VBAとの関係、導入手順まで一通り解説します(2026年7月時点)]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/07/xlwings-lite-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">「ExcelでPythonを動かしたいけど、環境構築でつまずいてやめた」という経験はありませんか？</p>



<p class="wp-block-paragraph">この記事で紹介する<strong>xlwings Lite</strong>は、Python本体のインストールもpipも要らずに、Excelの中でPythonを動かせる無料アドインです<br>公式は、これを<strong><span class="swl-marker mark_yellow">VBAの体験を現代化するもの</span></strong>と位置づけていて、VBAを触ってきた方にもなじみやすい立ち位置になっています</p>



<p class="wp-block-paragraph">ただ、名前が似ている「pip版のxlwings」や、マイクロソフト純正の「Python in Excel」と混同しやすいのも事実です<br>この記事では、まずそこの違いをほどいてから、料金・できること・制約・VBAとの関係・導入手順までを、初心者の方向けに広く浅くまとめていきます</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「環境構築が要らないPython」って、最初のハードルがぐっと下がります</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">この記事は<strong>2026年7月時点</strong>の情報をもとにまとめています<br>xlwings Liteは更新が活発なので、料金やバージョン番号は変わる可能性があります、最新は公式サイトで確認してみてください</p>
</div></div>



<h2 class="wp-block-heading">xlwings Liteとは Excel内で動くPython</h2>



<p class="wp-block-paragraph">結論から言うと、xlwings Liteは<strong><span class="swl-marker mark_yellow">Python本体をインストールしなくてもExcelの中でPythonを動かせる無料アドイン</span></strong>です<br>Excelにアドインを1つ追加するだけで、Pythonでカスタム関数を作ったり、pandasでデータを処理したりできるようになります</p>



<p class="wp-block-paragraph">なぜPython本体が要らないのかというと、xlwings Liteは<strong>Pyodide</strong>という仕組みを使っているからです<br>Pyodideは、ざっくり言うと「ブラウザの中で動くPython」で、WebAssembly(ウェブブラウザが理解できる低レベルな実行形式)の上でPythonを走らせます</p>



<p class="wp-block-paragraph">最近のExcelアドインは、内部にブラウザの部品を持っています<br>その中でPythonが動くので、パソコンにPythonを入れていなくてもコードが実行できる、という理屈です</p>



<h3 class="wp-block-heading">pip版のxlwingsとは別物です</h3>



<p class="wp-block-paragraph">ここが最初につまずきやすいポイントです<br>同じ「xlwings」という名前でも、昔からある<strong>pip版のxlwings</strong>と、今回の<strong>xlwings Lite</strong>は仕組みが違います</p>



<p class="wp-block-paragraph">pip版のxlwingsは、パソコンにインストールしたPython本体とExcelを橋渡しするライブラリです<br><strong>pip installでの導入とPython 3.9以上</strong>が必要で、「外にあるPythonからExcelを操作する」スタイルになります</p>



<p class="wp-block-paragraph">一方のxlwings Liteは、<strong><span class="swl-marker mark_yellow">Excelの中でPythonが完結する</span></strong>ので、Python本体もpipも要りません<br>同じブランドですが、「外のPythonと繋ぐ(pip版)」か「Excelの中で完結する(Lite)」かで役割がまったく違う、と押さえておくと混乱しません</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<ul class="wp-block-list -list-under-dashed">
<li><strong>pip版xlwings</strong> … 外のPython本体とExcelを繋ぐライブラリ(pipとPythonが必要)</li>



<li><strong>xlwings Lite</strong> … Excelの中でPythonが完結するアドイン(Python本体もpipも不要)</li>
</ul>
</div></div>



<p class="wp-block-paragraph">通常のPythonをパソコンに入れて使う方法が気になる方は、<a href="https://javeo.jp/python-install/" target="_blank" rel="noopener noreferrer">Pythonのインストール手順を解説した記事</a>もあわせてどうぞ<br>xlwings Liteは、その導入自体が要らない点が大きな違いです</p>



<h3 class="wp-block-heading">コードはワークブックの中に保存される</h3>



<p class="wp-block-paragraph">xlwings Liteで書いたPythonコードは、そのExcelのワークブックの中に一緒に保存されます<br>だから、ワークブックを誰かに渡すと、受け取った人も同じxlwings Liteアドインを入れればそのまま動かせます</p>



<p class="wp-block-paragraph">VBAでいう「マクロ有効ブック」に近い立ち位置ですが、コードの実行を担うのはアドインそのものです<br>コードだけ入っていてもアドインが無いと動かないので、配布相手にもアドインの導入は必要になります</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「コードがブックに同梱される」から、配布が楽なんです</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">対応環境と料金 買い切りOfficeでも無料</h2>



<p class="wp-block-paragraph">xlwings Liteの魅力は、対応する環境の広さと料金の分かりやすさです<br>まず対応環境から見ていきます</p>



<p class="wp-block-paragraph">公式によると、xlwings Liteは<strong>Windows・macOS・Excel for the web(ブラウザ版)</strong>で動きます<br>しかも<strong><span class="swl-marker mark_yellow">Microsoft 365だけでなく、買い切り版(Office 2021以降)にも対応</span></strong>しています</p>



<p class="wp-block-paragraph">ここが後で出てくるPython in Excelとの大きな差です<br>Python in Excelはサブスクリプション専用ですが、xlwings Liteは買い切りのOfficeでも使えるので、月額を払っていない方にも門戸が開いています</p>



<p class="wp-block-paragraph">さらに、無料のオンライン版Excel(office.comにブラウザでログインして使う版)でも試せます<br>WindowsではOffice 2019も特定の条件付きで対応していますが、その条件の中身は本記事では未確認なので、詳しくは公式の対応状況ページを確認してみてください</p>



<p class="wp-block-paragraph">ブラウザの部品を内部で使う仕組み上、<strong>比較的新しいバージョンのモダンブラウザ</strong>が必要です<br>macOSのデスクトップ版はmacOS 13(Ventura)以降が目安とされますが、この記事の読者はWindowsが中心なので、Mac要件は軽く触れる程度にとどめます</p>



<h3 class="wp-block-heading">ストア版は個人も商用も無料</h3>



<p class="wp-block-paragraph">料金はとてもシンプルです<br>Excelのアドインストア経由で入れるxlwings Liteは、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">個人利用も商用利用も無料</span></strong>で、登録やログインも要りません(2026年7月時点)</p>



<p class="wp-block-paragraph">公式FAQでも「制限なく個人・商用で使える」と明記されています<br>将来ずっと無料であることを保証する記述までは無いので、あくまで<strong>2026年7月時点では無料</strong>、という前提で読んでください</p>



<p class="wp-block-paragraph">有料になるのは<strong>セルフホスト版</strong>(自前のサーバーで動かす版)だけです<br>これはxlwingsの有料プランに含まれていて、公式の料金ページではProfessionalの年1,600ドルからとなっています、金額はプランや条件で変わるので正確な額は公式の料金ページで確認してみてください</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">ふつうにストアから入れて使う分には、個人でも仕事でも料金はかかりません<br>「セルフホスト版のみ有料」という整理だけ覚えておけば大丈夫です</p>
</div></div>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>買い切りOfficeで無料、はVBA派にとって嬉しい条件です</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">Python in Excelとの違いを比較表で整理</h2>



<p class="wp-block-paragraph">次に多い混同が、マイクロソフト純正の<strong>Python in Excel</strong>との違いです<br>どちらも「ExcelでPythonを動かす」機能ですが、中身はかなり性格が違います</p>



<p class="wp-block-paragraph">いちばん大きいのは<strong>実行される場所</strong>です<br>Python in Excelはマイクロソフトのクラウド(Azure)上で計算され、実行のたびにワークブックの内容がクラウドへ送られます</p>



<p class="wp-block-paragraph">対してxlwings Liteは、利用者のパソコン上で計算が完結します<br>そのため<strong>原則としてデータが外部に送信されません</strong></p>



<p class="wp-block-paragraph">ただし1つだけ例外があります<br>カスタム関数で画像(図)を返す場合は、その処理でデータが外に出ます<br>これはセルフホストにすると回避できます</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">「xlwings Liteはデータを一切外に出さない」と言い切ると不正確です<br>正しくは<strong>原則は外に出ない、ただしカスタム関数で画像を返す場合だけは例外</strong>(セルフホストで回避可)という理解が安全です</p>
</div></div>



<p class="wp-block-paragraph">料金・対応Excel・機能面も含めて、主な違いを1枚の表にまとめます<br>横に長いので、スマホでは横スクロールして見てください</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:900px;--swl-cell1-width:180px;"><thead><tr><th>項目</th><th>Python in Excel(マイクロソフト)</th><th>xlwings Lite</th></tr></thead><tbody><tr><td>実行場所</td><td>Azureクラウド(実行のたびブックを送信)</td><td>利用者のPC・ブラウザ内で完結</td></tr><tr><td>データ送信</td><td>クラウドへ送信あり</td><td>原則なし(※画像を返すカスタム関数は例外/セルフホストで回避可)</td></tr><tr><td>料金</td><td>標準は365に付属/有料アドオンは月24ドル(年288ドル相当)</td><td>無料(ストア版)、セルフホスト版のみ有料</td></tr><tr><td>ライセンス要件</td><td>Microsoft 365 専用</td><td>365 + 買い切り版(2021以降)+ 無料オンライン版</td></tr><tr><td>Excelオブジェクト操作</td><td>不可</td><td>可</td></tr><tr><td>カスタム関数(UDF)</td><td>不可</td><td>可</td></tr><tr><td>使用回数の上限</td><td>非公開のクオータあり</td><td>上限なし</td></tr><tr><td>コードの保存先</td><td>PYセル(グリッド内)</td><td>ワークブックの中</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">料金の欄を補足します<br>Python in Excelは365のBusiness/Enterpriseなら標準の計算資源を追加料金なしで使えますが、<strong>高速な計算資源(プレミアムコンピュート)や計算モードの切替</strong>を得るための有料アドオンが月24ドル(1ユーザーあたり)です</p>



<p class="wp-block-paragraph">この月24ドルという額は、マイクロソフトの解説記事で示されている数値です<br>年に直すと24ドル×12で年288ドル相当になります、なお、この額はマイクロソフトのライセンスFAQ本文に書かれているわけではない点も添えておきます</p>



<h3 class="wp-block-heading">Excelのオブジェクトを直接触れるかどうか</h3>



<p class="wp-block-paragraph">VBAを触ってきた方に効くのが、この違いです<br>xlwings Liteは<strong>Excelのオブジェクトモデル</strong>(セルやシート・ブックをコードから直接操作する仕組み)にアクセスできます</p>



<p class="wp-block-paragraph">VBAでRangeやWorksheetを直接触るあの感覚を、Pythonで再現できるイメージです<br>一方のPython in Excelはグリッドに数式のように書くスタイルで、オブジェクトを直接操作するタイプではありません、ここは質的な違いになります</p>



<h3 class="wp-block-heading">結局どちらを選べばいい?</h3>



<p class="wp-block-paragraph">ここは私の見立てとしての整理です(公式が一文で断言しているわけではありません)<br>ざっくり、次のような使い分けが分かりやすいと思います</p>



<ul style="background-color:#FFFFDC80" class="wp-block-list -list-under-dashed has-background">
<li>データを外に出したくない・買い切り版や無料オンライン版のExcelを使う・自作関数やオブジェクト操作をしたい → <strong>xlwings Lite</strong></li>



<li>Microsoft 365を使っていて、クラウドの潤沢な計算資源を数式感覚で使いたい → <strong>Python in Excel</strong></li>
</ul>



<p class="wp-block-paragraph">なお、公式の比較ページはxlwings側が書いたものなので、多少はLite寄りの見方になっている点は念頭に置いておくと公平です<br>Python in Excelの新機能まわりは、<a href="https://javeo.jp/excel-microsoft365-features/" target="_blank" rel="noopener noreferrer">Microsoft 365のExcel新機能をまとめた記事</a>でも触れているので、あわせて読むと全体像がつかめます</p>



<h2 class="wp-block-heading">xlwings Liteでできること</h2>



<p class="wp-block-paragraph">ここからは、xlwings Liteで実際にできることを見ていきます<br>広く浅く言うと、<strong><span class="swl-marker mark_yellow">Pythonの力をExcelの中に持ち込める</span></strong>のがポイントです</p>



<p class="wp-block-paragraph">できることを大きく並べると、次のようになります<br>どれも「Pythonでいつも書いていること」をExcelから使える、という方向性です</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li><strong>カスタム関数(UDF)</strong> … 自作のワークシート関数をPythonで定義できる</li>



<li><strong>ストリーミング関数(RTD)</strong> … 値がリアルタイムに更新される関数を作れる</li>



<li><strong>Matplotlibでの作図</strong> … Pythonでグラフを描いてExcelに返せる</li>



<li><strong>pandasでのデータ処理</strong> … 表データの加工・集計をPythonで</li>



<li><strong>Excelオブジェクトの操作</strong> … セルやシートをコードから直接いじれる</li>



<li><strong>Web APIへのアクセス</strong> … 外部サービスからデータを取ってくる</li>
</ul>



<p class="wp-block-paragraph">用語を1つ噛み砕いておきます<br><strong>RTD(ストリーミング関数)</strong>は、株価のように随時変わる値を、関数の結果としてリアルタイムに更新し続けられる仕組みです、xlwings Liteでは2026年6月のアップデートで対応しました</p>



<p class="wp-block-paragraph"><strong>UDF(ユーザー定義関数)</strong>は、自分で作るワークシート関数のことです<br>Pythonで書いた処理を、セルに <code>=MYFUNC(A1)</code> のように呼び出せるイメージだと思ってください</p>



<p class="wp-block-paragraph">直近の目玉は、<strong><span class="swl-marker mark_yellow">2026年7月1日の更新でMatplotlibの図の正式サポート</span></strong>が入ったことです<br>この機能はpip版xlwingsライブラリの0.36.8以上を必要とします(2026年7月時点)</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">バージョン番号は2種類あって混同しやすいです<br>アドイン版のバージョン(1.0.0系)と、pip版xlwingsライブラリのバージョン(0.36.8)は<strong>別系統の番号</strong>なので、分けて考えてください</p>
</div></div>



<p class="wp-block-paragraph">簡単なカスタム関数のイメージも載せておきます<br>下は「引数を2倍にして返すだけ」の最小サンプルです(実際のコードはこの記事のあとで導入手順を追ってから書く流れになります)</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from xlwings import func

@func
def double(x):
    return x * 2</code></pre></div>



<p class="wp-block-paragraph">このように書いておくと、Excelのセルで <code>=DOUBLE(A1)</code> のように呼び出せる、という感覚です<br>細かい書き方は更新で変わることもあるので、実際に使うときは公式のドキュメントも見てみてください</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「Pythonの関数がExcelの関数になる」って、けっこう楽しいです</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>

<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>


<h2 class="wp-block-heading">できないこと・注意点も先に知っておく</h2>



<p class="wp-block-paragraph">便利な一方で、xlwings Liteには苦手なことや制約もあります<br>期待して入れてから「あれ、動かない」とならないよう、先に押さえておきましょう</p>



<p class="wp-block-paragraph">これらの多くは、土台であるPyodide(ブラウザ内で動くPython)の制約から来ています<br>1つずつ見ていきます</p>



<h3 class="wp-block-heading">動かないライブラリがある(Polarsなど)</h3>



<p class="wp-block-paragraph">まず、すべてのライブラリが使えるわけではありません<br>公式の制約ページでは、<strong><span class="swl-marker mark_yellow">Polarsは動作しない</span></strong>と明記されています</p>



<p class="wp-block-paragraph">理由は、Polarsがマルチスレッド・マルチプロセッシング(複数の処理を同時並行で走らせる仕組み)に依存していて、現状のPyodideではそこがうまく動かないためです<br>データ処理でよく使われる<strong>pandasは使える</strong>ので、まずはpandasで組むのが無難です</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">「pandasの代わりにPolarsやDuckDBも使える」と紹介されることがありますが、Polarsは公式が動かないと明記しています<br>DuckDBの可否はこの記事では未確認なので、<strong>使えると決めつけずに実機で試す</strong>のが安全です</p>
</div></div>



<p class="wp-block-paragraph">ほかにも、C言語で書かれた高速部分を持つパッケージは、Pyodide向けに特別なビルドが要ります<br>そのため、たとえばPyTorchのような重い機械学習ライブラリは、現状は使えないものに含まれます</p>



<h3 class="wp-block-heading">メモリ・データベース・重い処理の制約</h3>



<p class="wp-block-paragraph">ほかにも押さえておきたい制約がいくつかあります<br>まとめて並べます</p>



<ul class="wp-block-list -list-under-dashed">
<li><strong>メモリ上限は2GB</strong> … Pyodideの制限のため、大きなデータ処理には向かない</li>



<li><strong>データベース接続に制約</strong> … TCP/IP接続が使えず、PostgreSQLなどへ直接繋げない(SQLiteは使える)</li>



<li><strong>デバッガが現状なし</strong> … 込み入った処理の追跡はしづらい</li>



<li><strong>Python・パッケージのバージョンは自由に選べない</strong> … Pyodideの配布に依存する</li>
</ul>



<p class="wp-block-paragraph">ざっくり言うと、<strong>軽い作業には向くけれど、重い処理や厳密なバージョン固定が要る業務には弱い</strong>という整理になります<br>大量データのゴリゴリした集計や、特定バージョンで固めたい本番処理は、別の手段のほうが向くこともあります</p>



<h3 class="wp-block-heading">初回や新しいライブラリを入れるときはネットが要る</h3>



<p class="wp-block-paragraph">ここは誤解されやすいので分けて説明します<br>xlwings Liteの<strong>計算はローカルで完結し、データは外に出ません</strong>、ここは前に書いたとおりです</p>



<p class="wp-block-paragraph">ただ、Pyodide本体や新しく使うPythonパッケージは、既定ではネット越しにダウンロードして取得します<br>そのため<strong><span class="swl-marker mark_yellow">初回や新しいライブラリを入れるときはインターネット接続が必要</span></strong>です</p>



<p class="wp-block-paragraph">「データが外に出ない」ことと「初回はネットが要る」ことは、別の話として両立します<br>だから「完全にオフラインで使える」と言い切るのは少し不正確で、完全なオフライン運用にはセルフホストなどの設定が必要になります</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「計算は手元・取得はネット」と分けて覚えると混乱しません</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">VBAとの関係 乗り換えか併用か</h2>



<p class="wp-block-paragraph">VBAを使ってきた方が気になるのは、「これはVBAの後継なの?」という点だと思います<br>まず公式の言い方を正確に確認しておきます</p>



<p class="wp-block-paragraph">公式サイトの表現は「VBAの体験を現代化する(brings the VBA experience into the modern age)」です<br>つまり「VBAはもうダメ」と切り捨てる言い方ではなく、<strong><span class="swl-marker mark_yellow">VBAでやってきたことを、今どきの形で置き換える</span></strong>という位置づけになっています</p>



<p class="wp-block-paragraph">VBAと比べて良い点として整理できるのは、次のあたりです<br>いずれも個々の事実には裏付けがあります</p>



<ul class="wp-block-list is-style-good_list -list-under-dashed">
<li>言語がPythonなので、pandasなどの豊富なライブラリを使える</li>



<li>Excelのオブジェクトモデルにも、Pythonからアクセスできる</li>



<li>コードがワークブックに入るので配布しやすい</li>



<li>実行はローカル完結で、原則データが外に出ない</li>
</ul>



<p class="wp-block-paragraph">とはいえ、VBAがすぐに要らなくなるわけではありません<br>ここは私の見立てですが、<strong>当面は「乗り換え」より「用途で併用」が現実的</strong>だと思っています</p>



<p class="wp-block-paragraph">理由はシンプルで、xlwings Liteには前の章で見た制約(重いライブラリが使えない・2GBメモリ・アドインが前提など)があるからです<br>すでにある膨大なVBA資産や、アドインを入れられない環境、軽いイベント駆動の処理では、VBAのほうが手堅い場面が残ります</p>



<p class="wp-block-paragraph">これからVBAの基礎から触ってみたい方は、<a href="https://javeo.jp/vba-loop/" target="_blank" rel="noopener noreferrer">VBAのループ処理を解説した記事</a>や<a href="https://javeo.jp/variables-constants/" target="_blank" rel="noopener noreferrer">VBAの変数と定数の記事</a>から入ると流れがつかめます<br>VBAとPython、どちらも引き出しにあると選択肢が広がります</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>どちらか一択でなく、得意なほうを場面で使い分ける感覚です</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h2 class="wp-block-heading">xlwings Liteの導入手順</h2>



<p class="wp-block-paragraph">それでは導入手順です<br>登録もログインも要らず、<strong>アドインを入れるだけ</strong>で使い始められます</p>



<p class="wp-block-paragraph">下の手順は骨子です<br>ボタンの日本語表記はExcelのバージョンで少し変わるので、英語のボタン名も併記しておきます(実際の画面はこのあとキャプチャで確認できるようにします)</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">アドインの一覧を開く</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">Excelを開き、リボンの「ホーム」タブ(古い版では「挿入」タブ)にある「アドイン」ボタン(<strong>Add-ins</strong>)を押します<br>ストアの画面が開いたら、必要に応じて「その他のアドイン」(<strong>More Add-ins</strong>)を選びます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2.png"><img decoding="async" width="1024" height="498" src="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2-1024x498.png" alt="" class="wp-image-4883" srcset="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2-1024x498.png 1024w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2-300x146.png 300w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2-150x73.png 150w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2-768x373.png 768w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h06_57-2.png 1401w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">xlwingsを検索して追加</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">ストアの検索欄に「<strong>xlwings</strong>」と入力して検索します<br>xlwings Liteが出てきたら「追加」(<strong>Add</strong>)を押します</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44-1024x538.png" alt="" class="wp-image-4884" srcset="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44-300x158.png 300w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h10_44.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">エディタを開く</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">追加が終わると、「ホーム」タブの右端に<strong>xlwings Lite</strong>のボタンが出ます<br>それを押すと、画面の右側に作業ペイン(エディタ)が開きます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54.png"><img decoding="async" width="1024" height="537" src="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54-1024x537.png" alt="" class="wp-image-4885" srcset="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54-1024x537.png 1024w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54-300x157.png 300w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_21h11_54.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">最初のコードを書いて実行</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">エディタにPythonのコードを書いて、実行してみます<br>まずは前に載せたような、小さなカスタム関数から試すと感覚がつかめます</p>



<figure class="wp-block-embed is-type-video is-provider-youtube wp-block-embed-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<iframe title="xlwings Lite入門 Excelで動く無料Python" width="500" height="281" src="https://www.youtube.com/embed/goeZWP3qP5I?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
</div></figure>
</div></div>
</div>



<h3 class="wp-block-heading">ライブラリの追加はrequirements.txtに書く</h3>



<p class="wp-block-paragraph">pandasなど追加のライブラリを使いたいときは、pip installの代わりの操作があります<br>エディタの<strong>requirements.txt</strong>タブに、使いたいパッケージ名を書き足すと、自動でインストールが始まります</p>



<p class="wp-block-paragraph">編集したあとはxlwings Liteの再起動が要る点だけ覚えておいてください<br>「pip installの代わりにrequirements.txtに書く」と捉えると、pip版との違いがイメージしやすいです</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17.png"><img decoding="async" width="1024" height="537" src="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17-1024x537.png" alt="" class="wp-image-4887" srcset="https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17-1024x537.png 1024w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17-300x157.png 300w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/07/2026-07-03_23h42_17.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">合わなければ簡単に消せます<br>「アドイン」ボタン →「その他のアドイン」(<strong>More Add-ins</strong>)→「マイアプリ」(<strong>Manage your Apps</strong>)から、xlwings Liteの三点メニューで「削除」(<strong>Remove</strong>)を選べば外せます(表記はバージョンで変わります)</p>
</div></div>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「入れるだけ・消すだけ」なので、まず試してみるのがおすすめです</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>


<h3 class="wp-block-heading">コードはAIに書いてもらう手もあります</h3>



<p class="wp-block-paragraph">「Pythonのコードを自分で書くのはまだ不安」という方も多いと思います<br>そういうときは、やりたいことを日本語で伝えて、<strong>コードはAIに書いてもらう</strong>のも十分アリです</p>



<p class="wp-block-paragraph">たとえば、次のような頼み方をすると、xlwings Lite用のカスタム関数の下書きが返ってきます<br>返ってきたコードは、内容を確認してから貼るのが安全です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-markup" data-lang="依頼テンプレート"><code>xlwings LiteのカスタムUDFを作りたいです
・やりたいこと:（例）A1の金額に消費税10%を足して返す関数
・関数名：（例）ADDTAX
Python本体は使わずxlwings Liteで動く前提で、
@func デコレータを使った最小のコードを書いてください
書き込む前に、コードの内容を私に説明してから提示してください</code></pre></div>



<p class="wp-block-paragraph">AIにコードを書いてもらう流れの雰囲気は、<a href="https://javeo.jp/vibecoding-challenge/" target="_blank" rel="noopener noreferrer">AIでアプリを作ってみた体験記</a>でも紹介しています<br>「まず動かしてみる」に、AIはかなり相性が良いです</p>



<h2 class="wp-block-heading">まとめ どんな人に向くか</h2>



<p class="wp-block-paragraph">最後に、xlwings Liteがどんな人に向くかを整理します<br>ここまでの内容をぎゅっとまとめると、次のようになります</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>Python本体やpipの環境構築でつまずいた・そこを飛ばしたい方</li>



<li>買い切り版Officeや無料オンライン版のExcelでPythonを試したい方</li>



<li>データを外に出したくない業務でPythonを使いたい方</li>



<li>VBAの次の一手として、自作関数やオブジェクト操作をPythonでやってみたい方</li>
</ul>



<p class="wp-block-paragraph">逆に、大量データのゴリゴリした処理や、Polarsのような一部ライブラリ、厳密なバージョン固定が要る場面は苦手です<br>そこは無理せず、VBAや通常のPython環境と<strong>用途で使い分ける</strong>のが現実的だと思います</p>



<p class="wp-block-paragraph">2026年7月時点では、更新がかなり活発なプロダクトです<br>2026年上半期だけでもストリーミング関数・オブジェクト操作・Python 3.14系への更新・Matplotlib対応と、短い間に機能が増えています</p>



<p class="wp-block-paragraph">その分、まだ発展途上で仕様が変わりうる面もあります<br>料金やバージョン番号は<strong>この記事の時点(2026年7月)</strong>のものなので、実際に使う前には公式サイトで最新を確認してみてください</p>



<p class="wp-block-paragraph">環境構築のハードルなしにExcelの中でPythonを試せるのは、初心者の方にとって大きな一歩です<br>まずは無料のストア版を入れて、小さなカスタム関数から触ってみるのがおすすめです</p>


<div class="swell-block-balloon"><div class="c-balloon -bln-left" data-col="blue"><div class="c-balloon__icon -circle"><img decoding="async" src="data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==" data-src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="lazyload c-balloon__iconImg" width="80px" height="80px"><noscript><img decoding="async" src="https://javeo.jp/wp-content/uploads/2026/05/cropped-サイトアイコン2.png" alt="" class="c-balloon__iconImg" width="80px" height="80px"></noscript><span class="c-balloon__iconName">ジャベ雄</span></div><div class="c-balloon__body -speaking -border-on"><div class="c-balloon__text">
<p>「まず入れて、小さく試す」から始めると失敗しにくいです</p>
<span class="c-balloon__shapes"><span class="c-balloon__before"></span><span class="c-balloon__after"></span></span></div></div></div></div>

<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/xlwings-lite/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Outlook (new)でメールをExcelに出す【VBA非対応】</title>
		<link>https://javeo.jp/outlook-new-email-export/</link>
					<comments>https://javeo.jp/outlook-new-email-export/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 16 Jun 2026 11:02:41 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Outlook]]></category>
		<category><![CDATA[Power Automate]]></category>
		<category><![CDATA[メール]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4691</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/outlook-new-email-export-v2-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>Outlook (new)はVBAやマクロが非対応でメールをExcel化できません、Microsoft公式が代替に挙げるPython(Microsoft Graph)とPower Automateの2つの方法を、コードと手順つきで紹介します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/outlook-new-email-export-v2-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">Outlook (new)に切り替わってから、いつものVBAでメールをExcelに出そうとしたら<strong><span class="swl-marker mark_yellow">マクロがまったく動かなくなった</span></strong>、という方に向けた記事です</p>



<p class="wp-block-paragraph">結論から言うと、Outlook (new)ではVBAやCOM操作が使えません、これはバグでも設定ミスでもなく、Microsoftがそういう作りにしたためです</p>



<p class="wp-block-paragraph">とはいえメールをExcelに落とす手段がなくなったわけではないので、この記事ではMicrosoftが公式に代替として案内している<strong>Python(Microsoft Graph)</strong>とPower Automateの2つを、設定の流れとコードつきで紹介していきます</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">この記事で分かること</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>Outlook (new)でVBAが動かない理由(公式見解)</li>



<li>過去メールも全件取りたいなら Python + Microsoft Graph</li>



<li>ノーコードでやるなら Power Automate(新着メールの自動収集向き)</li>



<li>2つの方法のどちらを選べばいいか</li>
</ul>
</div></div>



<h2 class="wp-block-heading">なぜOutlook (new)でVBAが使えないのか</h2>



<p class="wp-block-paragraph">まず「なぜ動かないのか」をはっきりさせておきます、ここを理解しておくと、無駄に設定をいじって時間を溶かさずに済みます</p>



<p class="wp-block-paragraph">Outlook (new)は、これまでのOutlook (classic)(デスクトップ版)とはまったく別の作りになっています、中身はWeb技術(WebView2)ベースで、ブラウザで動くOutlook on the webに近いものです</p>



<p class="wp-block-paragraph">VBAでメールを取得するときは、<strong>Outlook.Application</strong> や GetNamespace(&#8220;MAPI&#8221;) といったCOMという仕組み(アプリ同士をつなぐWindowsの仕掛け)を経由してOutlookのデータにアクセスしていました</p>



<p class="wp-block-paragraph">ところがOutlook (new)には、この<strong><span class="swl-marker mark_yellow">COMの窓口そのものが用意されていません</span></strong>、だから CreateObject(&#8220;Outlook.Application&#8221;) の時点で失敗してしまい、これまでのマクロが軒並み動かなくなるわけです</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">Microsoftは公式ドキュメントで<strong><span class="swl-marker mark_yellow" style="color:#e8313b">「Outlook (new)ではVBAとマクロをサポートしない」</span></strong>とはっきり書いています(VBA, Macros, and Custom Flows Alternatives)</p>



<p class="wp-block-paragraph">将来サポートされる予定も今のところアナウンスされていないので、Outlook (new)で使う前提なら、VBA以外の手段に乗り換えるのが現実的です</p>
</div></div>



<h3 class="wp-block-heading">Outlook (classic)に戻せばVBAは今までどおり動く</h3>



<p class="wp-block-paragraph">ここで1つ逃げ道もお伝えしておきます</p>



<p class="wp-block-paragraph">もし手元の環境でOutlook (classic)に戻せるなら、Outlookウィンドウ右上のトグルで切り替えるだけで、これまでのVBAマクロがそのまま使えます、Outlook (classic)は2026年時点でまだサポートが続く見込みです</p>



<p class="wp-block-paragraph">「とりあえず今までのマクロをもう一度動かしたいだけ」という場合は、Outlook (classic)に戻すのが一番手っ取り早いです、VBAでメールをExcel化する具体的なコードは<a href="https://javeo.jp/get-outlook-data/" target="_blank" rel="noopener noreferrer">OutlookのメールデータをExcelに取得するマクロ</a>でまとめているので、そちらをどうぞ</p>



<p class="wp-block-paragraph">会社の方針などでOutlook (classic)に戻せない、あるいは将来を見据えてVBA以外でやっておきたい、という方はこの先の2つの方法に進んでください</p>



<h2 class="wp-block-heading">方法1 Pythonで取得する(Microsoft Graph API)</h2>



<p class="wp-block-paragraph">1つめは<strong>Python + Microsoft Graph API</strong>です、Microsoftが用意しているメール取得用のAPI(外部からデータを取りに行く窓口)をPythonから叩いて、メールをまとめてExcelに書き出します</p>



<p class="wp-block-paragraph">こちらは設定にひと手間かかりますが、<strong><span class="swl-marker mark_yellow">過去メールも含めて全件取得できる</span></strong>のが強みです、日付や件名でフィルタしたり、取得項目を自由に選べたりと、細かい制御が効きます</p>



<h3 class="wp-block-heading">ステップ1 必要なライブラリを入れる</h3>



<p class="wp-block-paragraph">使うライブラリは3つです、認証用のmsal、API通信用のrequests、Excel書き出し用のopenpyxlを入れます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-bash" data-lang="Bash"><code>pip install msal requests openpyxl</code></pre></div>



<h3 class="wp-block-heading">ステップ2 Azure AD(Microsoft Entra ID)にアプリを登録する</h3>



<p class="wp-block-paragraph">Graph APIを使うには、自分のアプリをMicrosoft側に登録して<strong>CLIENT_ID</strong>(アプリの身分証のようなもの)をもらう必要があります、ここが今回いちばんの山場なので、画面ごとに区切って進めていきます</p>



<p class="wp-block-paragraph">作業するのは<strong>Microsoft Entra管理センター</strong>(entra.microsoft.com)です、以前はAzureポータル(portal.azure.com)の「Azure Active Directory」と呼ばれていた場所で、今は<strong>Microsoft Entra ID</strong>に名前が変わっています、どちらから入っても同じ設定にたどり着けます</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">アプリの登録から「新規登録」を開く</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">Entra管理センターにサインインして、「Entra ID」→「アプリの登録」→「新規登録」と進みます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-1024x538.png" alt="" class="wp-image-4721" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-300x158.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h13_48.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">名前とアカウントの種類を選んで登録する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">新規登録の画面には、上から「名前」「サポートされているアカウントの種類」「リダイレクトURI(任意)」の順で入力欄が並んでいます</p>



<ul class="wp-block-list -list-under-dashed">
<li><strong>名前</strong>:あとから変えられるので、自分が分かる名前でかまいません(例 outlook-mail-export)</li>



<li><strong>サポートされているアカウントの種類</strong>:迷ったら<span class="swl-marker mark_yellow">「任意のEntra IDテナント + 個人用Microsoftアカウント」</span>を選ぶと、個人のOutlook.com(Hotmail/Live)でも会社のMicrosoft 365でも同じ手順で動きます、選んだ種類でコードの<strong>TENANT_ID</strong>が変わるので、下のメモもあわせて見てください</li>



<li><strong>リダイレクトURI(任意)</strong>:ここは空のままでOKです、次のステップの「認証」で設定します</li>
</ul>



<p class="wp-block-paragraph">入力できたら「登録」をクリックします</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42.png"><img decoding="async" width="1024" height="589" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-1024x589.png" alt="" class="wp-image-4722" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-1024x589.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-300x173.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-150x86.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42-768x442.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h04_42.png 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">クライアントIDとテナントIDを控える</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">登録が終わると「概要」画面が開きます、ここに表示される<strong>アプリケーション(クライアント)ID</strong>をコピーしておきます、これがコードの<strong>CLIENT_ID</strong>です</p>



<p class="wp-block-paragraph">同じ画面の<strong>ディレクトリ(テナント)ID</strong>も控えておきます、こちらは<span class="swl-marker mark_yellow">「シングルテナントのみ」を選んだ場合だけ</span>コードのTENANT_IDに入れます(commonや個人用を使うなら不要です)</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-1024x538.png" alt="" class="wp-image-4723" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-300x158.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-150x79.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25-768x403.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h16_25.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">リダイレクトURIを設定する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">左メニューの「認証」(画面によっては<strong>「Authentication (Preview)」</strong>と表示されます)を開き、「リダイレクトURI構成」タブの「リダイレクトURIの追加」から<strong>「モバイルアプリケーションとデスクトップアプリケーション」</strong>のタイルを選びます</p>



<p class="wp-block-paragraph">リダイレクトURIに<strong><span class="swl-marker mark_yellow">http://localhost</span></strong>を指定して「構成」で保存します(推奨候補に出ていなければカスタムとして入力します)、<span class="swl-marker mark_yellow" style="color:#e8313b">これを入れておかないと、ログイン画面が返ってこずにエラーになります</span></p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14.png"><img decoding="async" width="1024" height="581" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-1024x581.png" alt="" class="wp-image-4726" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-1024x581.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-300x170.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-150x85.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14-768x436.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_14.png 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26.png"><img decoding="async" width="1024" height="581" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-1024x581.png" alt="" class="wp-image-4727" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-1024x581.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-300x170.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-150x85.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26-768x436.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_26.png 1190w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">APIのアクセス許可でMail.Readを追加する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">左メニューの「APIのアクセス許可」→「アクセス許可の追加」→「Microsoft Graph」→「委任されたアクセス許可」と進み、<strong>Mail.Read</strong>を探して追加します</p>



<p class="wp-block-paragraph">これで<strong><span class="swl-marker mark_yellow">自分のメールを読む権限</span></strong>がアプリに付きます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57.png"><img decoding="async" width="1024" height="528" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-1024x528.png" alt="" class="wp-image-4728" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-1024x528.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-300x155.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-150x77.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57-768x396.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h17_57.png 1353w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10.png"><img decoding="async" width="1024" height="528" src="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-1024x528.png" alt="" class="wp-image-4729" srcset="https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-1024x528.png 1024w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-300x155.png 300w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-150x77.png 150w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10-768x396.png 768w, https://javeo.jp/wp-content/uploads/2026/06/2026-06-16_19h31_10.png 1353w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>
</div></div>
</div>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">今回は自分のログインでアクセスする<strong>委任(デリゲート)</strong>の方式なので、アプリのシークレット(パスワード的なもの)は不要です</p>



<p class="wp-block-paragraph">はじめてログインするときに、Mail.Readの利用に同意するか聞かれることがあります、自分のアカウントに対する読み取りなので同意して進めて問題ないです</p>



<p class="wp-block-paragraph">ステップ2で選んだ<strong>「サポートされているアカウントの種類」</strong>に合わせて、コードの<strong>TENANT_ID</strong>に入れる値を変えます、ここがズレると<span class="swl-marker mark_yellow" style="color:#e8313b">「Please use the /consumers endpoint」のような認証エラー</span>になります</p>



<ul class="wp-block-list -list-under-dashed">
<li>任意のEntra IDテナント + 個人用(個人でも会社でも動く、迷ったらこれ):<strong><span class="swl-marker mark_yellow">common</span></strong></li>



<li>シングルテナントのみ(会社・学校のMicrosoft 365に限定):控えた<strong>ディレクトリ(テナント)ID</strong></li>



<li>個人用アカウントのみ(Outlook.com専用):<strong><span class="swl-marker mark_yellow">consumers</span></strong></li>
</ul>



<p class="wp-block-paragraph">画面にある「複数のEntra IDテナント」は、複数の会社にまたがって使うSaaSアプリ向けなので、今回のメール取得では選びません</p>
</div></div>



<h3 class="wp-block-heading">ステップ3 認証してメールを取得する</h3>



<p class="wp-block-paragraph">準備ができたらコードに進みます、まずは認証してアクセストークン(API利用の通行証)をもらう部分です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import msal

CLIENT_ID = &quot;ここにアプリケーション(クライアント)ID&quot;
TENANT_ID = &quot;common&quot;  # 個人でも会社でも動く、会社のアカウント専用なら控えたテナントID、個人専用なら consumers
SCOPES = [&quot;https://graph.microsoft.com/Mail.Read&quot;]

# パブリッククライアント(デスクトップアプリ)として認証する
app = msal.PublicClientApplication(
    CLIENT_ID,
    authority=f&quot;https://login.microsoftonline.com/{TENANT_ID}&quot;,
)

# ブラウザが立ち上がってMicrosoftのログイン画面が出る
result = app.acquire_token_interactive(scopes=SCOPES)
token = result[&quot;access_token&quot;]</code></pre></div>



<p class="wp-block-paragraph">このコードを実行するとブラウザが立ち上がり、いつものMicrosoftのログイン画面が出ます、ログインが終わるとトークンが手に入ります</p>



<p class="wp-block-paragraph">続いてGraph APIを叩いてメール一覧を取ります、ポイントは<strong><span class="swl-marker mark_yellow">ページング処理</span></strong>です</p>



<p class="wp-block-paragraph">Graph APIは一度に全件は返してくれず、続きがある場合は応答の中に<strong>@odata.nextLink</strong>という「次のページのURL」が入ってきます、これが無くなるまでループで取りに行きます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import requests

# Prefer ヘッダーで本文をHTMLでなくプレーンテキストで受け取る
headers = {
    &quot;Authorization&quot;: f&quot;Bearer {token}&quot;,
    &quot;Prefer&quot;: &#39;outlook.body-content-type=&quot;text&quot;&#39;,
}

# $top で1ページの件数、$select で欲しい項目だけに絞る
url = (&quot;https://graph.microsoft.com/v1.0/me/messages&quot;
       &quot;?$top=50&quot;
       &quot;&$select=subject,from,toRecipients,ccRecipients,receivedDateTime,isRead,hasAttachments,body&quot;)

all_messages = []
while url:
    resp = requests.get(url, headers=headers).json()
    all_messages.extend(resp.get(&quot;value&quot;, []))
    # 次のページがあれば nextLink が入る、無ければループ終了
    url = resp.get(&quot;@odata.nextLink&quot;)

print(f&quot;{len(all_messages)} 件取得しました&quot;)</code></pre></div>



<p class="wp-block-paragraph">$selectで欲しい項目だけに絞ると、通信量が減って取得も速くなります、今回は件名・差出人・宛先・CC・受信日時・既読フラグ・添付の有無・本文を取っています、ほかにどんな項目が取れるかは<a href="https://learn.microsoft.com/ja-jp/graph/api/resource/message" target="_blank" rel="noopener noreferrer">messageリソースの公式リファレンス</a>に一覧があります</p>



<h3 class="wp-block-heading">ステップ4 Excelに書き出す</h3>



<p class="wp-block-paragraph">最後にopenpyxlでExcelに書き出します、差出人・宛先・CCはどれも入れ子の構造で、メールによっては<strong>address</strong>が無く<strong>name</strong>だけのこともあるので、取り出す部分を<strong>addr_of</strong>と<strong>addr_list</strong>という小さな関数にまとめておくと扱いやすいです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import openpyxl

# 差出人・宛先・CCを取り出すヘルパー(address が無ければ name を使う)
def addr_of(person):
    ea = (person or {}).get(&quot;emailAddress&quot;, {})
    return ea.get(&quot;address&quot;) or ea.get(&quot;name&quot;, &quot;&quot;)

def addr_list(people):
    # toRecipients や ccRecipients は複数なので ; でつなぐ
    return &quot;; &quot;.join(addr_of(p) for p in (people or []))

wb = openpyxl.Workbook()
ws = wb.active
ws.append([&quot;件名&quot;, &quot;差出人&quot;, &quot;宛先&quot;, &quot;CC&quot;, &quot;受信日時&quot;, &quot;既読&quot;, &quot;添付&quot;, &quot;本文(先頭500字)&quot;])

for msg in all_messages:
    ws.append([
        msg.get(&quot;subject&quot;, &quot;&quot;),
        addr_of(msg.get(&quot;from&quot;)),
        addr_list(msg.get(&quot;toRecipients&quot;)),
        addr_list(msg.get(&quot;ccRecipients&quot;)),
        msg.get(&quot;receivedDateTime&quot;, &quot;&quot;),
        &quot;既読&quot; if msg.get(&quot;isRead&quot;) else &quot;未読&quot;,
        &quot;あり&quot; if msg.get(&quot;hasAttachments&quot;) else &quot;&quot;,
        msg.get(&quot;body&quot;, {}).get(&quot;content&quot;, &quot;&quot;)[:500],
    ])

wb.save(&quot;outlook_mail.xlsx&quot;)
print(&quot;outlook_mail.xlsx に保存しました&quot;)</code></pre></div>



<p class="wp-block-paragraph">本文は長くなりがちなので、ここでは先頭500字だけ取り出しています、全文が欲しい場合は<strong>[:500]</strong>を外してください</p>



<p class="wp-block-paragraph">ここまでをひとつのファイルにまとめたものを置いておきます、CLIENT_IDとTENANT_IDを自分の値に書き換えれば、そのまま動かせるはずです</p>



<div class="swell-block-accordion">
<details class="swell-block-accordion__item" data-swl-acc="wrapper"><summary class="swell-block-accordion__title" data-swl-acc="header"><span class="swell-block-accordion__label">コード全文（コピペ用）</span><span class="swell-block-accordion__icon c-switchIconBtn" data-swl-acc="icon" aria-hidden="true" data-opened="false"><i class="__icon--closed icon-caret-down"></i><i class="__icon--opened icon-caret-up"></i></span></summary><div class="swell-block-accordion__body" data-swl-acc="body">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="get_outlook_mail.py" data-lang="Python"><code>import msal
import requests
import openpyxl

CLIENT_ID = &quot;ここにアプリケーション(クライアント)ID&quot;
TENANT_ID = &quot;common&quot;  # 個人でも会社でも動く、会社のアカウント専用なら控えたテナントID、個人専用なら consumers
SCOPES = [&quot;https://graph.microsoft.com/Mail.Read&quot;]

# --- 認証(ブラウザでMicrosoftにログインする) ---
app = msal.PublicClientApplication(
    CLIENT_ID,
    authority=f&quot;https://login.microsoftonline.com/{TENANT_ID}&quot;,
)
result = app.acquire_token_interactive(scopes=SCOPES)
token = result[&quot;access_token&quot;]

# --- メール一覧を取得する ---
headers = {
    &quot;Authorization&quot;: f&quot;Bearer {token}&quot;,
    &quot;Prefer&quot;: &#39;outlook.body-content-type=&quot;text&quot;&#39;,
}
url = (&quot;https://graph.microsoft.com/v1.0/me/messages&quot;
       &quot;?$top=50&quot;
       &quot;&$select=subject,from,toRecipients,ccRecipients,receivedDateTime,isRead,hasAttachments,body&quot;)

all_messages = []
while url:
    resp = requests.get(url, headers=headers).json()
    all_messages.extend(resp.get(&quot;value&quot;, []))
    url = resp.get(&quot;@odata.nextLink&quot;)

print(f&quot;{len(all_messages)} 件取得しました&quot;)

# --- Excelに書き出す ---
def addr_of(person):
    ea = (person or {}).get(&quot;emailAddress&quot;, {})
    return ea.get(&quot;address&quot;) or ea.get(&quot;name&quot;, &quot;&quot;)

def addr_list(people):
    return &quot;; &quot;.join(addr_of(p) for p in (people or []))

wb = openpyxl.Workbook()
ws = wb.active
ws.append([&quot;件名&quot;, &quot;差出人&quot;, &quot;宛先&quot;, &quot;CC&quot;, &quot;受信日時&quot;, &quot;既読&quot;, &quot;添付&quot;, &quot;本文(先頭500字)&quot;])

for msg in all_messages:
    ws.append([
        msg.get(&quot;subject&quot;, &quot;&quot;),
        addr_of(msg.get(&quot;from&quot;)),
        addr_list(msg.get(&quot;toRecipients&quot;)),
        addr_list(msg.get(&quot;ccRecipients&quot;)),
        msg.get(&quot;receivedDateTime&quot;, &quot;&quot;),
        &quot;既読&quot; if msg.get(&quot;isRead&quot;) else &quot;未読&quot;,
        &quot;あり&quot; if msg.get(&quot;hasAttachments&quot;) else &quot;&quot;,
        msg.get(&quot;body&quot;, {}).get(&quot;content&quot;, &quot;&quot;)[:500],
    ])

wb.save(&quot;outlook_mail.xlsx&quot;)
print(&quot;outlook_mail.xlsx に保存しました&quot;)</code></pre></div>
</div></details>
</div>



<h3 class="wp-block-heading">受信トレイだけ・期間で絞りたいとき</h3>



<p class="wp-block-paragraph">上のコードはメール全体を取りますが、対象を絞りたいこともあると思います、URLのところを少し変えるだけで対応できます</p>



<p class="wp-block-paragraph">受信トレイだけに絞るなら<strong>me/mailFolders/inbox/messages</strong>にします、受信日時で絞るなら$filterを足します、たとえば2026年1月以降だけなら次のような形です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 受信トレイの、2026年1月以降のメールに絞る例
url = (&quot;https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messages&quot;
       &quot;?$top=50&quot;
       &quot;&$select=subject,from,toRecipients,ccRecipients,receivedDateTime,isRead,hasAttachments,body&quot;
       &quot;&$filter=receivedDateTime ge 2026-01-01T00:00:00Z&quot;)</code></pre></div>



<p class="wp-block-paragraph">このあたりを自由にいじれるのが、Pythonで取る方法のいちばんの魅力かなと思います、$filterや$orderbyで指定できる条件は<a href="https://learn.microsoft.com/ja-jp/graph/api/user-list-messages" target="_blank" rel="noopener noreferrer">List messagesのリファレンス</a>にまとまっています</p>



<h2 class="wp-block-heading">方法2 Power Automateで新着メールをExcelに追記する</h2>



<p class="wp-block-paragraph">2つめはノーコードでできる<strong>Power Automate</strong>です、プログラムを書かずに「メールが届いたらExcelに1行追記する」という流れ(フロー)を組めます</p>



<p class="wp-block-paragraph">Microsoft 365のアカウントがあれば、無料の枠でも基本的な自動フローは作れます、コードを書きたくない方はこちらの方が手軽です</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">先に大事な制約を1つ、Power Automateは<strong><span class="swl-marker mark_yellow">「これから届くメール」を自動で拾う仕組み</span></strong>です</p>



<p class="wp-block-paragraph">すでに受信トレイに溜まっている過去メールを一括でExcel化する用途には向きません、過去分もまとめて欲しいなら、方法1で紹介したPython(Microsoft Graph)の方が適しています</p>
</div></div>



<h3 class="wp-block-heading">事前準備 OneDriveにExcelを置いてテーブル化しておく</h3>



<p class="wp-block-paragraph">フローを作る前に、書き込み先のExcelを用意します、ここを先にやっておかないと後の設定でつまずきます</p>



<ul class="wp-block-list is-style-num_circle -list-under-dashed">
<li>OneDrive(またはSharePoint)にExcelファイルを置く ※ローカルPCのExcelは連携できません</li>



<li>1行目に「件名」「差出人」「受信日時」などの見出しを入れる</li>



<li>見出しを含めて範囲を選び、Excelの「挿入」→「テーブル」でテーブルに変換しておく</li>
</ul>



<p class="wp-block-paragraph">Power Automateの「行の追加」アクションは<strong><span class="swl-marker mark_yellow">テーブルにしか書き込めない</span></strong>ので、ただ見出しを打っただけのシートだと選択肢に出てきません、ここはハマりやすいポイントです</p>



<h3 class="wp-block-heading">フローを作る手順</h3>



<p class="wp-block-paragraph">準備ができたら、Power Automate(make.powerautomate.com)でフローを組みます、流れはとてもシンプルです</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">自動化したクラウドフローを新規作成</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">「作成」から「自動化したクラウドフロー」を選びます、トリガー(きっかけ)になるイベントを後で指定する形式です</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">トリガーに「新しいメールが届いたとき」を選ぶ</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">Office 365 Outlookの<strong>「新しいメールが届いたとき (V3)」</strong>を選びます、特定の差出人や件名だけに絞りたい場合は、ここのオプションで条件を指定できます</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">アクションに「表に行を追加」を選ぶ</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">次のステップでExcel Online (OneDrive) の<strong>「表に行を追加」</strong>を選び、さきほど用意したファイル・テーブルを指定します</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">各列にメールの値を割り当てる</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">「件名」列にはトリガーの件名、「差出人」列には差出人、というように動的なコンテンツをはめ込んでいきます、これで保存すれば完成です</p>
</div></div>
</div>



<p class="wp-block-paragraph">あとはメールが届くたびに、自動でExcelの最終行に1件ずつ積み上がっていきます、手作業のコピペから解放されるのは地味にうれしいポイントです</p>



<p class="wp-block-paragraph">本文も列に入れたい場合は本文プレビューを割り当てると扱いやすいです、本文全文はHTMLタグが混ざることがあるので、用途に合わせて選んでください</p>



<h2 class="wp-block-heading">どちらを選ぶか(比較)</h2>



<p class="wp-block-paragraph">2つの方法を表にまとめておきます、ざっくり言うと<strong><span class="swl-marker mark_yellow">過去メールも全部欲しいならPython、これからのメールを自動で貯めたいならPower Automate</span></strong>です</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:700px;"><thead><tr><th>項目</th><th>Python(Graph)</th><th>Power Automate</th></tr></thead><tbody><tr><td>必要なスキル</td><td>Pythonの基礎</td><td>ノーコード(画面操作だけ)</td></tr><tr><td>事前準備</td><td>Azure ADのアプリ登録</td><td>OneDriveにExcel+テーブル化</td></tr><tr><td>新着メールの自動収集</td><td>△ 定期実行の仕組みが別途必要</td><td>○ 得意</td></tr><tr><td>過去メールの一括取得</td><td>○ 全件取得できる</td><td>× できない</td></tr><tr><td>日付・件名での絞り込み</td><td>○ 自由に指定できる</td><td>△ 簡単な条件のみ</td></tr><tr><td>費用</td><td>無料(自分のアカウント範囲)</td><td>無料プランあり</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">「溜まった問い合わせメールを一気にExcelで分析したい」のような一括処理ならPython、「届いたメールを台帳に自動で記録していきたい」のような運用ならPower Automate、という住み分けがしっくりくると思います</p>



<p class="wp-block-paragraph">もちろん両方を組み合わせてもいいです、過去分はPythonで一気に吸い出して、これから先はPower Automateで貯めていく、という使い方も現実的です</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">Outlook (new)でメールをExcel化する方法を整理しました、最後にもう一度ポイントをまとめておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>Outlook (new)はVBA・COM非対応(Microsoft公式が明言、将来サポート予定もなし)</li>



<li>今までのマクロを動かしたいだけなら、Outlook (classic)に戻すのが最短</li>



<li>過去メールも全件・条件指定で取りたいなら Python + Microsoft Graph</li>



<li>新着メールを自動で貯めたいなら Power Automate(ノーコード)</li>
</ul>



<p class="wp-block-paragraph">VBAが使えなくなったと聞くと身構えてしまいますが、代わりの道はちゃんと用意されています、自分の目的に合う方を選んでもらえればと思います</p>



<p class="wp-block-paragraph">Outlook (classic)でVBAを使う具体的なコードは<a href="https://javeo.jp/get-outlook-data/" target="_blank" rel="noopener noreferrer">OutlookのメールデータをExcelに取得するマクロ</a>でまとめています、戻せる環境の方はこちらもあわせてどうぞ</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/outlook-new-email-export/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>CSSセレクタの書き方 自動化で要素を狙う指定方法【Selenium】</title>
		<link>https://javeo.jp/css-selector/</link>
					<comments>https://javeo.jp/css-selector/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 15:51:27 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4586</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/css-selector-1-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>自動化(Selenium・スクレイピング)で「要素を特定する」ためのCSSセレクタの書き方をまとめました、デザイン用のCSSとの違い、id・class・属性・結合子・nth-childの使い分け、動的id対策やDevTools任せの落とし穴まで、Pythonの例つきで解説します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/css-selector-1-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">SeleniumやスクレイピングでWebページを自動操作するとき、最初の関門になるのが「狙った要素をどう指定するか」です、ボタンを押す・文字を入力する・値を読み取る、どれも先に<strong>その要素を特定する</strong>ことから始まります</p>



<p class="wp-block-paragraph">そのときの「住所」にあたるのが<strong><span class="swl-marker mark_yellow">CSSセレクタ</span></strong>です、ページの中の「ここの要素」を文字列で言い当てるための書き方で、これが書けると自動化はぐっとラクになります</p>



<p class="wp-block-paragraph">CSSセレクタというとWebデザイン(見た目をつける)の文脈で出てくることが多いんですが、この記事では<strong>自動化で要素を狙う視点</strong>に絞ってまとめます、同じセレクタでも、デザインで便利な書き方と自動化で効く書き方は少しズレるので、そのあたりも整理していきます</p>



<p class="wp-block-paragraph">使用例はPython版のSeleniumで書きますが、<strong><span class="swl-marker mark_yellow">セレクタの構文そのものは言語やツールに依存しません</span></strong>、VBA版のSeleniumでも、BeautifulSoupのようなスクレイピングでも、<strong>UiPathやPower Automate DesktopといったRPAツール</strong>でも、Web要素を指す手段としてCSSセレクタが使えます、Pythonを使っていない方も、セレクタの部分はそのまま読み替えられます</p>



<p class="wp-block-paragraph">実際にブラウザを動かす操作コード(クリックや入力、待機、ループなど)は言語ごとの記事にまとめているので、この記事は<strong>「セレクタの書き方そのもの」に集中</strong>します、たとえばSeleniumVBAでの実装なら「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」にあります</p>



<h2 class="wp-block-heading">デザイン用のCSSと、自動化のセレクタは何が違う？</h2>



<p class="wp-block-paragraph">セレクタの具体的な書き方に入る前に、まずここを押さえておくと迷いません、<strong>同じCSSセレクタでも、見た目をつける(デザイン)目的と、要素を特定する(自動化)目的では、効くものと効かないものが違う</strong>んです</p>



<p class="wp-block-paragraph">大きく分けると、違いは次の4つです</p>



<h3 class="wp-block-heading">違い1 状態・装飾むけの擬似クラス・擬似要素は要素特定に効かない</h3>



<p class="wp-block-paragraph">デザインでよく使う <strong>::before</strong> や <strong>::after</strong>(擬似要素)は、自動化では使えません、これは見た目の上では存在しても、<strong><span class="swl-marker mark_yellow">DOM(ページの構造)には実体のノードが無い</span></strong>からです</p>



<p class="wp-block-paragraph">大事なのは、これがエラーになるのではなく<strong>常に「空」が返る</strong>という点です、MDNにも、擬似要素を含むセレクタは返り値が常に空になると明記されています、つまり「見つからない」のではなく「最初から取れない」ので、原因に気づきにくいハマりどころです</p>



<p class="wp-block-paragraph">同じく <strong>:hover</strong> / <strong>:focus</strong> / <strong>:active</strong> のような操作状態の擬似クラスも、自動化での要素特定にはほぼ使えません、構文としては有効ですが、「その瞬間その状態の要素」しか返さないので、静的に要素を狙う用途には向かないんです、フォーカス中の要素が必要なら、セレクタではなく <strong>activeElement</strong> を使うのが定石になります</p>



<h3 class="wp-block-heading">違い2 判定基準は「見た目に効くか」ではなく「querySelectorAllが解釈できるか」</h3>



<p class="wp-block-paragraph">ここが一番のキモです、自動化で使えるセレクタかどうかの判定基準は、<strong>そのセレクタをブラウザの querySelectorAll が解釈できるかどうか</strong>です</p>



<p class="wp-block-paragraph">というのも、SeleniumでCSSセレクタ指定(<strong>By.CssSelector</strong>)を使うと、<strong><span class="swl-marker mark_yellow">内部ではブラウザの querySelectorAll が呼ばれます</span></strong>、これはW3CのWebDriver仕様で定義されている動きです、要素1つを取る指定は先頭の1件、複数取る指定は当てはまる全件が返ります</p>



<p class="wp-block-paragraph">つまり、<strong>querySelectorが解釈できるセレクタ＝Seleniumで使えるセレクタ</strong>と考えてOKです、ブラウザのDevToolsのコンソールで <strong>document.querySelectorAll(&#8220;セレクタ&#8221;)</strong> を試して、ちゃんと要素が返ればSeleniumでも同じく使えます、これは自分でセレクタを検証するときにも役立つ考え方です</p>



<h3 class="wp-block-heading">違い3 「中の文字」では選べない</h3>



<p class="wp-block-paragraph">自動化だと「『送信』と書かれたボタンを押したい」のように、<strong>表示テキストで要素を狙いたい</strong>場面がよくあります、ところがCSSセレクタには、これがありません</p>



<p class="wp-block-paragraph"><strong>:contains()</strong> という書き方を見かけることがありますが、これはjQuery独自の非標準セレクタです、ブラウザの querySelectorAll に渡すとエラー(SyntaxError)になるので、Seleniumでも使えません</p>



<p class="wp-block-paragraph">テキストの中身で要素を選びたいときは、CSSではなく<strong>XPath</strong>の出番です、XPathなら <strong>text()</strong> や <strong>contains()</strong> が使えて、たとえば <strong>//button[contains(., &#8216;送信&#8217;)]</strong> のように「『送信』を含むボタン」を狙えます、このあたりの実装は実践コード集の方でも触れているので、後ほどリンクします</p>



<h3 class="wp-block-heading">違い4 「壊れにくさ」という評価軸が増える</h3>



<p class="wp-block-paragraph">デザイン用のCSSは、自分のサイトのHTMLに対して書くので、構造が変われば自分でセレクタも直せます、ところが自動化は<strong>他人のサイト(自分で変えられないHTML)</strong>を相手にすることが多いです</p>



<p class="wp-block-paragraph">すると、<strong><span class="swl-marker mark_yellow">そのセレクタが「ページの作りが少し変わっても壊れにくいか」</span></strong>という、装飾CSSには無かった評価軸が出てきます、同じ要素を狙うのにも、壊れにくい書き方と壊れやすい書き方があって、自動化では前者を選ぶ意識が要ります、この観点は後半のTipsでも具体的に見ていきます</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">まとめると、自動化のセレクタは「<strong>querySelectorAllが解釈できる範囲</strong>」で、「<strong>状態・装飾むけのものは除く</strong>」、「<strong>テキストで選ぶならXPath</strong>」、そして「<strong>壊れにくさも意識する</strong>」、この4点を頭に置いておけば、あとは個別の書き方を覚えるだけです</p>
</div></div>



<h2 class="wp-block-heading">基本のセレクタ(id・class・タグ)</h2>



<p class="wp-block-paragraph">まずは土台になる基本のセレクタからです、ここは自動化でもデザインでも共通で、一番よく使うところです</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:800px;"><thead><tr><th>探したいもの</th><th>セレクタ</th><th>例</th></tr></thead><tbody><tr><td>id で探す</td><td>#id名</td><td>#search</td></tr><tr><td>class で探す</td><td>.class名</td><td>.btn</td></tr><tr><td>タグ名で探す</td><td>タグ名</td><td>input</td></tr><tr><td>複数クラスのAND(両方持つ)</td><td>.classA.classB</td><td>.btn.primary</td></tr><tr><td>グループ化のOR(どちらか)</td><td>セレクタA, セレクタB</td><td>.btn, .link</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ポイントになるのが、下2つの組み合わせです、<strong>.btn.primary</strong> のように<strong>クラスをくっつけて書く</strong>と「両方のクラスを持つ要素」を狙えます(AND)、間にスペースを入れないのがコツで、スペースを入れると意味が変わるので注意です</p>



<p class="wp-block-paragraph">逆に<strong>カンマで区切る</strong>と「どちらかに当てはまる要素」をまとめて取れます(OR)、複数種類のボタンをいっぺんに集めたいときなどに便利です</p>



<p class="wp-block-paragraph">Python版のSeleniumだと、こんな感じで指定します、<strong>find_element</strong> の第2引数に、上のセレクタ文字列をそのまま渡すだけです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from selenium.webdriver.common.by import By

# id が search の要素を探す
driver.find_element(By.CSS_SELECTOR, "#search")

# class が btn かつ primary の要素(両方のクラスを持つもの)
driver.find_element(By.CSS_SELECTOR, ".btn.primary")

# input タグを全部取る(find_elements は複数形・リストで返る)
driver.find_elements(By.CSS_SELECTOR, "input")</code></pre></div>



<p class="wp-block-paragraph">セレクタの文字列が同じなら、VBA版のSeleniumでも考え方は同じです、VBAなら <strong>driver.FindElement(By.CssSelector, &#8220;#search&#8221;)</strong> のようにメソッド名や書き方は変わりますが、渡すセレクタ文字列(<strong>#search</strong>)はまったく同じものを使えます</p>



<h2 class="wp-block-heading">属性セレクタ(動的id・class対策の主役)</h2>



<p class="wp-block-paragraph">ここからが、自動化でとくに頼りになるセレクタです、<strong>属性セレクタ</strong>は、要素が持つ属性(name・type・href・id・classなど)を手がかりに要素を狙う書き方です</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:900px;"><thead><tr><th>狙い方</th><th>セレクタ</th><th>意味・例</th></tr></thead><tbody><tr><td>属性が存在する</td><td>[attr]</td><td>[disabled] … disabled属性を持つ</td></tr><tr><td>完全一致</td><td>[attr=&#8217;値&#8217;]</td><td>[name=&#8217;q&#8217;] … nameがちょうど q</td></tr><tr><td>前方一致(で始まる)</td><td>[attr^=&#8217;値&#8217;]</td><td>[id^=&#8217;btn-&#8216;] … idが btn- で始まる</td></tr><tr><td>後方一致(で終わる)</td><td>[attr$=&#8217;値&#8217;]</td><td>[href$=&#8217;.pdf&#8217;] … hrefが .pdf で終わる</td></tr><tr><td>部分一致(を含む)</td><td>[attr*=&#8217;値&#8217;]</td><td>[class*=&#8217;primary&#8217;] … classに primary を含む</td></tr><tr><td>単語一致(空白区切り)</td><td>[attr~=&#8217;値&#8217;]</td><td>空白区切りの単語のどれかに一致</td></tr><tr><td>ハイフン始まり一致</td><td>[attr|=&#8217;値&#8217;]</td><td>値 か 値- で始まる(lang指定などで使う)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">このうち、自動化でとくに重宝するのが<strong><span class="swl-marker mark_yellow">前方一致(^=)・後方一致($=)・部分一致(*=)の3つ</span></strong>です、なぜかというと、最近のサイトは <strong>id=&#8221;btn-8f3a2&#8243;</strong> のように、<strong>毎回ランダムに変わるid・class</strong>を持っていることが多いからです</p>



<p class="wp-block-paragraph">こういう「変わる部分」を完全一致で書くと、ページを開き直すたびに壊れます、そこで、<strong>変わらない部分だけを前方一致や部分一致で拾う</strong>と安定します、たとえば <strong>btn-</strong> の部分が固定なら、後ろのランダム文字は無視して <strong>[id^=&#8217;btn-&#8216;]</strong> で狙う、という具合です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># name 属性が q の要素(完全一致)
driver.find_element(By.CSS_SELECTOR, "[name='q']")

# id が btn- で始まる要素(後ろがランダムでもOK・前方一致)
driver.find_element(By.CSS_SELECTOR, "[id^='btn-']")

# class に primary を含む要素(部分一致)
driver.find_element(By.CSS_SELECTOR, "[class*='primary']")

# href が .pdf で終わるリンクを全部取る(後方一致)
driver.find_elements(By.CSS_SELECTOR, "[href$='.pdf']")</code></pre></div>



<p class="wp-block-paragraph">ちなみに、値の大文字・小文字を無視したいときは、閉じカッコの直前に <strong> i</strong> を付けます、<strong>[type=&#8217;text&#8217; i]</strong> のように書くと、TEXT でも Text でもマッチします、地味ですが、サイトによって表記がそろっていないときに効きます</p>



<h2 class="wp-block-heading">結合子(子孫・直下・隣接・一般兄弟)</h2>



<p class="wp-block-paragraph">セレクタ同士をつないで「位置関係」で絞り込むのが<strong>結合子</strong>です、似た要素がたくさんあるページで、狙った1つに寄せるときに効いてきます</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:900px;"><thead><tr><th>結合子</th><th>書き方</th><th>意味</th></tr></thead><tbody><tr><td>子孫(スペース)</td><td>.親 .子</td><td>親の中にある(何段下でもよい)</td></tr><tr><td>直下の子(&gt;)</td><td>.親 &gt; .子</td><td>親のすぐ下の子だけ</td></tr><tr><td>隣接兄弟(+)</td><td>.A + .B</td><td>Aの直後にある兄弟B(1つだけ)</td></tr><tr><td>一般兄弟(~)</td><td>.A ~ .B</td><td>Aより後ろにある兄弟Bすべて</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">このうち、<strong>子孫(スペース)</strong>と<strong>直下の子(&gt;)</strong>は基本でよく使うので、ここでは軽めにいきます、ざっくり言うと、スペースは「ずっと下まで含めて探す」、<strong>&gt;</strong> は「すぐ下の階層だけに限定する」です</p>



<p class="wp-block-paragraph">むしろ覚えておきたいのが、後半の2つ、<strong>隣接兄弟(+)</strong>と<strong>一般兄弟(~)</strong>です、これは「ある要素の<strong>横(同じ親の中の並び)</strong>」を狙う書き方で、フォームのラベルと入力欄のような「隣り合った要素」を取るときに便利です</p>



<p class="wp-block-paragraph"><strong>+</strong> は「<strong><span class="swl-marker mark_yellow">直後の兄弟1つだけ</span></strong>」、<strong>~</strong> は「<strong>後ろに続く兄弟すべて</strong>」を指します、たとえば「<strong>label</strong> のすぐ後ろの <strong>input</strong>」を狙うなら <strong>label + input</strong>、「ある見出しより後ろにある段落を全部」なら <strong>h2 ~ p</strong> という具合です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># .list の中にある .item をすべて(子孫・何段下でもよい)
driver.find_elements(By.CSS_SELECTOR, ".list .item")

# .list のすぐ下の .item だけ(直下の子)
driver.find_elements(By.CSS_SELECTOR, ".list &gt; .item")

# label の直後にある input(隣接兄弟・1つだけ)
driver.find_element(By.CSS_SELECTOR, "label + input")

# .title より後ろに並ぶ .row をすべて(一般兄弟)
driver.find_elements(By.CSS_SELECTOR, ".title ~ .row")</code></pre></div>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">兄弟系の結合子はあくまで「<strong>後ろ方向</strong>」しか狙えません、「直前の兄弟」や「親」を遡る指定はCSSセレクタにはありません(親方向は後半で触れます)、横の並びは前から後ろへ、と覚えておくと混乱しにくいです</p>
</div></div>



<h2 class="wp-block-heading">位置・除外で狙う(:nth-child・:not とFindElements+indexの使い分け)</h2>



<p class="wp-block-paragraph">「上から何番目」や「これは除く」という狙い方もあります、構造系の擬似クラスと呼ばれるもので、自動化でも普通に使えます、ただ、ここはSeleniumならではの選択肢もあるので、その使い分けまで含めて見ていきます</p>



<h3 class="wp-block-heading">除外できる :not() はCSSの強み</h3>



<p class="wp-block-paragraph">まず、自動化でも素直に役立つのが <strong>:not()</strong> です、これは「<strong>カッコ内のセレクタに当てはまらないもの</strong>」を狙う書き方で、「○○以外」をセレクタ1本で表現できます</p>



<p class="wp-block-paragraph">たとえば <strong>input:not([disabled])</strong> と書くと、「<strong><span class="swl-marker mark_yellow">無効化されていない入力欄だけ</span></strong>」を取れます、押せないボタンや入力できない欄を最初から除けるので、自動化のエラー回避にそのまま効きます、これはVBA側でループして弾く手間が省けるので、CSSセレクタならではの便利さです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 無効化(disabled)されていない input だけを取る
driver.find_elements(By.CSS_SELECTOR, "input:not([disabled])")</code></pre></div>



<h3 class="wp-block-heading">:nth-child は「使えるけど、集めてループでも同じ」</h3>



<p class="wp-block-paragraph">「上から○番目の要素」を狙うのが <strong>:nth-child(n)</strong> です、ほかにも <strong>:first-child</strong>(最初)、<strong>:last-child</strong>(最後)、<strong>:nth-of-type(n)</strong>(同じタグの中で○番目)があります</p>



<p class="wp-block-paragraph">これらは確かに使えるんですが、自動化では<strong><span class="swl-marker mark_yellow">FindElements で全部集めてから、index(番号)やループで取り出しても同じこと</span></strong>ができます、どちらが正解というより、両方できると知っておくのが良いです</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 方法A セレクタで「2番目の li」を直接狙う
driver.find_element(By.CSS_SELECTOR, "li:nth-child(2)")

# 方法B 全部集めてから index で2番目を取る(リストは0始まりなので [1] が2番目)
els = driver.find_elements(By.CSS_SELECTOR, "li")
print(els[1].text)   # [0]が1番目、[1]が2番目</code></pre></div>



<p class="wp-block-paragraph">むしろ <strong>:nth-child</strong> には、知らないとハマるクセがあります、これは「<strong>すべての兄弟をひっくるめて数えた○番目</strong>」を見るので、たとえば <strong>li:nth-child(2)</strong> は「2番目の子が li ならそれ」という意味です、もし li の前に別のタグが混じっていると、番号がズレて狙いが外れます</p>



<p class="wp-block-paragraph">「同じ種類のタグの中での○番目」が欲しいなら、<strong>:nth-of-type</strong> の方が直感に近いです、ただ、このあたりの数え方の混乱もあって、自動化では<strong>FindElements で集めてindexやループで取り出す方が、結果が読めて安全な場面が多い</strong>と感じます、番号がズレる心配がなく、コードを見ても何番目を取っているかが分かりやすいからです</p>



<p class="wp-block-paragraph">ついでに、CSSで「親に近いこと」をやりたいなら <strong>:has()</strong> という擬似クラスもあります、<strong>div:has(&gt; img)</strong> で「imgを直下に持つdiv」のように、中身を条件にして親側を狙えます、ただし<strong><span class="swl-marker mark_yellow">:has() は比較的新しい機能</span></strong>(Chrome・Edgeは105、Safariは15.4、Firefoxは121以降)なので、古いブラウザを自動操作する場合は注意してください</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">使い分けの目安はこんな感じです、<strong>「○○以外」を除くのは :not() が手早い</strong>、<strong>「上から○番目」は :nth-child でも書けるが、FindElements で集めてindex・ループの方が読めて安全なことが多い</strong>、と覚えておけば十分です、どちらにしても、位置で狙う指定は<strong>ページの構造が変わると壊れやすい</strong>ので、可能ならidやclass・属性で狙える方を先に探すのがおすすめです、実際のループ処理の書き方は「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」の複数要素ループの章にまとめています</p>
</div></div>



<h2 class="wp-block-heading">自動化での実践Tips</h2>



<p class="wp-block-paragraph">最後に、セレクタを実際に書くときに効いてくるコツを、いくつかまとめておきます、ここを意識すると、壊れにくくて読みやすいセレクタが書けるようになります</p>



<h3 class="wp-block-heading">一意に絞るコツ … 属性やclassを組み合わせる</h3>



<p class="wp-block-paragraph">狙った1つに絞れないときは、<strong>条件を足して組み合わせる</strong>のが基本です、タグ＋属性、class＋属性、親の中の子…と重ねていくと、似た要素の中から目的のものを言い当てられます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># タグ + 属性 + 親で絞り込む(検索フォームの中の送信ボタンなど)
driver.find_element(By.CSS_SELECTOR, "form.search button[type='submit']")</code></pre></div>



<h3 class="wp-block-heading">動的id・classは部分一致で逃がす</h3>



<p class="wp-block-paragraph">さっきの属性セレクタの章ともつながりますが、<strong>毎回変わるid・class</strong>を相手にするときは、完全一致を避けて<strong>前方一致・部分一致</strong>で「変わらない部分」だけを拾います、これは動的なページを自動操作するときの定番テクニックです</p>



<h3 class="wp-block-heading">DevToolsの「Copy selector」は鵜呑みにしない</h3>



<p class="wp-block-paragraph">ブラウザのDevToolsには、要素を右クリックして「Copy selector」でセレクタをコピーできる機能があります、便利なんですが、<strong><span class="swl-marker mark_yellow">出てくるのは body からの長い nth-child パスになりがち</span></strong>で、これがけっこう脆いんです</p>



<p class="wp-block-paragraph">こういう「上から数えていく」パスは、ページの作りがちょっと変わるだけで簡単に壊れます、なので、コピーしたものをそのまま使うより、<strong>ユニークなidやclassを見つけて手で書き直す</strong>方が、ずっと壊れにくいセレクタになります、Copy selectorは「とっかかり」くらいに考えておくのがちょうどいいです</p>



<h3 class="wp-block-heading">テキスト・親方向で狙うときはXPath</h3>



<p class="wp-block-paragraph">ここまで見てきたとおり、CSSセレクタには2つだけ苦手があります、<strong>表示テキストで選ぶこと</strong>と、<strong>子から親へ遡ること</strong>です、この2つはXPathの担当だと割り切ると、迷わなくなります</p>



<figure class="wp-block-table is-style-stripes"><table><thead><tr><th>やりたいこと</th><th>得意なほう</th></tr></thead><tbody><tr><td>id・class・属性で特定</td><td>CSS(簡潔)</td></tr><tr><td>構造(子孫・兄弟)で特定</td><td>CSS(簡潔)</td></tr><tr><td>表示テキストで選ぶ</td><td>XPath(text() / contains())</td></tr><tr><td>子から親へ遡る</td><td>XPath(.. を使う)</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">テキストで探す書き方(全要素を集めてループで文字一致を見る方法)や、親へ遡る <strong>&#8220;..&#8221;</strong> の使い方は、「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」でVBA版の実際のコード付きで紹介しています、CSSで狙えるところはCSSで、苦手なところだけXPathで、と分担させるのが組みやすいです</p>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">自動化で要素を狙うCSSセレクタの書き方を、ひととおり整理してみました、最後にポイントをまとめておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>自動化で使えるセレクタかどうかは「<strong>querySelectorAllが解釈できるか</strong>」が判定基準、<strong>::before</strong> などの擬似要素は常に空が返る、<strong>:contains()</strong> は非標準で使えない</li>



<li>基本は <strong>#id</strong> / <strong>.class</strong> / タグ、複数クラスのANDは <strong>.a.b</strong>、ORは <strong>カンマ区切り</strong>で書ける</li>



<li>毎回変わるid・class対策には、<strong>属性の前方一致(^=)・部分一致(*=)</strong>が主役、結合子は子孫(スペース)・直下(&gt;)・隣接兄弟(+)・一般兄弟(~)</li>



<li>「○○以外」は <strong>:not()</strong>、位置で狙う <strong>:nth-child</strong> は使えるが番号のズレに注意、<strong>FindElements で集めてindex・ループ</strong>の方が安全な場面も多い</li>



<li>DevToolsの <strong>Copy selector</strong> は脆いので手で書き直す、テキスト・親方向はXPathに任せる</li>
</ul>



<p class="wp-block-paragraph">セレクタの書き方そのものは、ここまでの内容でだいたいカバーできます、あとは実際にブラウザを動かすコード(クリック・入力・待機・ループなど)と組み合わせるだけです、SeleniumVBAでの実装は「<a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBAの使い方 実践コード集</a>」に、導入から知りたい方は「<a href="https://javeo.jp/selenium-vba/" target="_blank" rel="noopener noreferrer">Excelでもブラウザ操作！SeleniumVBAの使い方</a>」にまとめてあります</p>



<p class="wp-block-paragraph">Python版で「結局どのByを使えばいいの？」というところは「<a href="https://javeo.jp/selenium-find-element/" target="_blank" rel="noopener noreferrer">Seleniumのfind_elementの使い方</a>」が、要素が出てくるまで待つ書き方は「<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Selenium WebDriverWaitの使い方</a>」が参考になります、Chromeの起動オプションまわりは「<a href="https://javeo.jp/chrome-options-service/" target="_blank" rel="noopener noreferrer">SeleniumのOptionsとServiceまとめ</a>」も合わせてどうぞ</p>



<p class="wp-block-paragraph">セレクタが書けるようになると、自動化でできることが一気に広がります、まずは身近なページで、DevToolsの <strong>document.querySelectorAll()</strong> を使ってセレクタを試してみるところから始めてみてください</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/css-selector/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Python転職の始め方｜自動化スキルを活かすロードマップ</title>
		<link>https://javeo.jp/python-career-change/</link>
					<comments>https://javeo.jp/python-career-change/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Tue, 09 Jun 2026 13:38:30 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[初心者]]></category>
		<category><![CDATA[自動化]]></category>
		<category><![CDATA[転職]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=4570</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/python-career-change-1024x539.jpg" class="webfeedsFeaturedVisual" /></p>業務でVBA/Pythonの自動化を触ってきた人が、そのスキルを武器にPython職へ転職する道筋を、足りない部分の補強や講座・スクールの選び方、ポートフォリオの作り方まで実体験ベースでまとめました]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/python-career-change-1024x539.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">VBAやPythonで業務を自動化したり、Seleniumでスクレイピングを組んだり——そういうことが自分でできるなら、その<strong><span class="swl-marker mark_yellow">スキルは転職市場でちゃんと武器になります</span></strong></p>



<p class="wp-block-paragraph">ただ正直なところ、「業務の延長で書いている」状態と「実務のエンジニアとして働く」状態の間には、まだ少し差があります、そこを埋めないまま飛び込むと苦労しがちなんですね</p>



<p class="wp-block-paragraph">この記事では、私自身も業務の自動化から入った立場で、今あるスキルを武器にPython職へ転職するための道筋——何が足りなくて、どう補強して、どう動くか——を順番にまとめてみました</p>



<h2 class="wp-block-heading">業務で自動化してるスキルは転職の武器になる</h2>



<p class="wp-block-paragraph">まず大前提として、あなたが普段やっている自動化は、世間で思われているよりずっと価値があります</p>



<p class="wp-block-paragraph">VBAでExcel業務を自動化する、Pythonでデータを集めて整形する、Seleniumでブラウザ操作を自動化する——こういうのは<strong>実務でそのまま需要があるスキル</strong>です、現場には「コードは書けないけど業務は分かる」人が大多数なので、<strong><span class="swl-marker mark_yellow">「業務を理解したうえで自動化できる」人材は普通に重宝されます</span></strong></p>



<p class="wp-block-paragraph">受け皿も意外と広くて、社内SEやDX推進の担当、データ周りのエンジニア、Pythonを使う開発職など、いきなりWebアプリのバリバリ開発でなくても入り口はいろいろあります</p>



<p class="wp-block-paragraph">たとえば<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">SeleniumのWebDriverWaitで待機処理を書く</a>とか、<a href="https://javeo.jp/vba-json/" target="_blank" rel="noopener noreferrer">VBAでJSONを扱う</a>みたいなことが自力でできるなら、それはもう「ちょっと書ける」のレベルは超えています、自信を持っていいところです</p>



<h2 class="wp-block-heading">ただ&#8221;業務の延長&#8221;だけだと足りない部分</h2>



<p class="wp-block-paragraph">とはいえ、自分用や社内用に書くコードと、仕事として納品するコードには差があります、ここを正直に把握しておくのが大事です</p>



<p class="wp-block-paragraph">実務で求められて、独学だと抜けがちなのはこのあたりです</p>



<ul class="wp-block-list is-style-bad_list">
<li>保守性（他人が読んで直せるコード、命名や構造の整理）</li>



<li>テストやエラー処理（動けばOKでは済まない、想定外への備え）</li>



<li>Gitでのバージョン管理とチーム開発の進め方</li>



<li>要件をヒアリングして設計に落とす力</li>
</ul>



<p class="wp-block-paragraph">逆に言えば、コードを書く土台はもうあるので、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">この&#8221;実務開発との差&#8221;を埋めれば一気に転職レベルに届きます</span></strong>、ゼロから始める完全未経験の人より、ずっと有利なスタート地点にいるわけですね</p>



<h2 class="wp-block-heading">足りないスキルを効率よく補強する</h2>



<p class="wp-block-paragraph">足りない部分を埋める手段は、ざっくり「ピンポイントの講座」と「体系的なスクール」に分かれます、今の自分にどれくらい足りないかで選ぶといいです</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:760px;"><thead><tr><th>補強手段</th><th>形態</th><th>費用感（執筆時点）</th><th>こんな人に</th></tr></thead><tbody><tr><td>Coloso</td><td>買い切りの動画講座</td><td>講座ごと（月額なし）</td><td>弱点だけピンポイントで足したい</td></tr><tr><td>Python Winner</td><td>マンツーマンのPython特化スクール</td><td>給付金対象（条件で補助）</td><td>体系的に学び直して転職支援も欲しい</td></tr><tr><td>SHIFT TERAS CAMPUS</td><td>本格エンジニア転職スクール</td><td>数十万・給付金で軽減</td><td>転職に振り切りたい</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">弱点をピンポイントで埋めるなら：Coloso</h3>



<p class="wp-block-paragraph">「Gitだけ」「データ処理だけ」のように<strong>足りない分野が見えている</strong>なら、買い切りの動画講座が手軽です、Colosoは現役プロが教える講座が分野ごとに揃っていて、Python・データ・自動化・AIあたりも選べます</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>必要な分野だけ買い切りで学ぶ</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">Colosoは<strong><span class="swl-marker mark_yellow">月額の縛りがない買い切り型</span></strong>なので、「この部分だけ」と割り切って補強するのに向いています、気になる講座があるか見てみるところからどうぞ</p>



<figure class="wp-block-image"><a href="https://px.a8.net/svt/ejp?a8mat=4B41ZJ+4MPFPE+5Q4A+601S1" rel="nofollow">
<img decoding="async" border="0" width="300" height="250" alt="" src="https://www21.a8.net/svt/bgt?aid=260529679280&#038;wid=003&#038;eno=01&#038;mid=s00000026713001008000&#038;mc=1"></a><img decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=4B41ZJ+4MPFPE+5Q4A+601S1" alt=""></figure>



<div class="swell-block-button is-style-btn_solid"><a href="https://px.a8.net/svt/ejp?a8mat=4B41ZJ+4MPFPE+5Q4A+5Z6WX" rel="noopener noreferrer" class="swell-block-button__link"><span>Colosoの講座を見てみる</span></a></div>
</div></div>



<h3 class="wp-block-heading">体系的に学び直して転職支援も：Python Winner</h3>



<p class="wp-block-paragraph">「独学の穴が多そう」「転職活動も支えてほしい」なら、Python特化のスクールが安心です、Python WinnerはWinスクールが運営するPython・AI・データ分析特化のスクールで、<strong>マンツーマンレッスン</strong>なので自分の弱点に合わせて進められます</p>



<p class="wp-block-paragraph">経済産業省のリスキリング講座（Reスキル講座）に認定されていて、条件を満たせば給付金で受講料が補助されます、dodaなど大手の転職エージェントと連携した就職・転職サポートがあるのも、未経験から動く人には心強いところですね</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>マンツーマン＋給付金で学ぶ</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">給付金の条件や金額は執筆時点のものなので、最新は公式で確認してくださいね、無料相談で自分が対象か聞いてみるのが早いです</p>



<figure class="wp-block-image"><a href="https://px.a8.net/svt/ejp?a8mat=4B41ZJ+4WTSZM+529E+HW2Q9" rel="nofollow">
<img decoding="async" border="0" width="300" height="250" alt="" src="https://www28.a8.net/svt/bgt?aid=260529679297&amp;wid=003&amp;eno=01&amp;mid=s00000023621003005000&amp;mc=1"></a><img decoding="async" border="0" width="1" height="1" src="https://www18.a8.net/0.gif?a8mat=4B41ZJ+4WTSZM+529E+HW2Q9" alt=""></figure>



<div class="swell-block-button is-style-btn_solid"><a href="https://px.a8.net/svt/ejp?a8mat=4B41ZJ+4WTSZM+529E+HW2Q9" rel="noopener noreferrer" class="swell-block-button__link"><span>Python Winnerを見てみる</span></a></div>
</div></div>



<h3 class="wp-block-heading">転職に振り切るなら：SHIFT TERAS CAMPUS</h3>



<p class="wp-block-paragraph">「短期で本気で転職まで持っていきたい」なら、転職特化のスクールという選択肢もあります、SHIFT TERAS CAMPUS（旧DMM WEBCAMP）は、チーム開発やオリジナル開発など<strong>実務に近いカリキュラム</strong>で、転職保証が付くコースも用意されています</p>



<p class="wp-block-paragraph">料金は数十万円とそれなりですが、専門実践教育訓練給付金の対象で、条件を満たせば<strong><span class="swl-marker mark_yellow">最大80%（上限64万円）が戻る</span></strong>ので、実質負担はぐっと下がります（金額や条件は執筆時点なので公式で確認を）</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>転職保証付きで一気に</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">給付金を使えるか、どのコースが合うかは無料カウンセリングで相談できます、まず話を聞いてみて判断するのがいいと思います</p>



<figure class="wp-block-image"><a href="//af.moshimo.com/af/c/click?a_id=5599197&#038;p_id=1363&#038;pc_id=2297&#038;pl_id=20505" rel="nofollow" referrerpolicy="no-referrer-when-downgrade" attributionsrc><img decoding="async" src="//image.moshimo.com/af-img/0323/000000020505.png" width="300" height="250" style="border:none;"></a><img decoding="async" src="//i.moshimo.com/af/i/impression?a_id=5599197&#038;p_id=1363&#038;pc_id=2297&#038;pl_id=20505" width="1" height="1" style="border:none;" loading="lazy"></figure>



<div class="swell-block-button is-style-btn_solid"><a href="//af.moshimo.com/af/c/click?a_id=5599197&amp;p_id=1363&amp;pc_id=2297&amp;pl_id=20505" rel="noopener noreferrer" class="swell-block-button__link"><span>SHIFT TERAS CAMPUSを見てみる</span></a></div>
</div></div>



<p class="wp-block-paragraph">ちなみに、Pythonそのものより<strong>AIの活用側</strong>に広げたいなら、未経験からAIを学んで仕事に活かす講座もあります、自分の進みたい方向に合わせて選ぶといいですね</p>



<h2 class="wp-block-heading">ポートフォリオは「作った自動化」を見せるだけでいい</h2>



<p class="wp-block-paragraph">転職で効くのが、口で「できます」と言うより<strong>動くものを見せる</strong>ことです、そして自動化を触ってきた人は、ここで出せる材料をすでに持っていることが多いです</p>



<ul class="wp-block-list is-style-good_list">
<li>業務で作った自動化ツールを、汎用化してGitHubに公開する（社内情報は消す）</li>



<li>スクレイピングやデータ整形の小さな成果物をまとめる</li>



<li>作った経緯や工夫をブログに書く（説明できる力も伝わる）</li>
</ul>



<p class="wp-block-paragraph">「実務で困りごとを自動化で解決した」という話は、<strong><span class="swl-marker mark_yellow">そのまま実績として刺さります</span></strong>、完全未経験の人が課題を提出するより、リアルで強いんですね</p>



<p class="wp-block-paragraph">発信のイメージがわかない人は、私が書いている<a href="https://javeo.jp/vba-gmail-send/" target="_blank" rel="noopener noreferrer">VBAでGmailを送る</a>や<a href="https://javeo.jp/decompile-pyinstaller/" target="_blank" rel="noopener noreferrer">PyInstallerの中身を見る</a>のような記事も、「作ったもの・調べたことを公開する」一例として眺めてみてください</p>



<h2 class="wp-block-heading">転職活動の動き方</h2>



<p class="wp-block-paragraph">スキルとポートフォリオが整ってきたら、実際の動き方です、ここはサービスの宣伝ではなく素直なところを書きます</p>



<p class="wp-block-paragraph">求人を探すなら、転職エージェントと求人サイトを併用するのが定番です、エージェントは複数登録して相性のいい担当を見つけると進めやすいです、IT・Web系に強いところを選ぶと、自動化スキルの価値も伝わりやすいですね</p>



<p class="wp-block-paragraph">職務経歴書では、<strong>「何を自動化して、どんな成果が出たか」を数字で言語化</strong>するのがポイントです、「手作業◯時間を◯分に短縮」のような具体が効きます、異業種や非エンジニアからの転職でも、ここが書ければ十分に戦えます</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">年齢や経験で難易度が変わるのは事実なので、そこは現実的に、ただ「自動化で業務改善した実績」は年代を問わず評価されやすいので、そこを軸に動くのがおすすめです</p>
</div></div>



<h2 class="wp-block-heading">まとめ｜まずは棚卸しと、1つ補強から</h2>



<p class="wp-block-paragraph">Python転職の道筋を、4ステップで振り返っておきます</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">今のスキルを棚卸しする</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">VBA・Python・Selenium・データ処理など、自分が書けることと、実務で足りなそうな部分を書き出します</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">足りない所を1つ補強する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">ピンポイントならColoso、体系的に＋転職支援ならPython Winner、転職に振り切るならSHIFT TERAS、と現在地で選びます</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">作ったものをポートフォリオにする</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">業務で作った自動化を汎用化して公開、経緯をブログに残すと、説明できる力もセットで伝わります</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">エージェントを使って動く</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">IT系に強いエージェントを複数登録、職務経歴書は「自動化の成果を数字で」言語化して進めます</p>
</div></div>
</div>



<p class="wp-block-paragraph">大事なのは、<strong><span class="swl-marker mark_yellow">完全なゼロからではなく、すでにある自動化スキルの上に積む</span></strong>という意識です、いきなり全部やろうとせず、まずは棚卸しと、足りない所を1つ補強するところから始めてみてくださいね</p>



<div class="swell-block-capbox cap_box is-style-onborder_ttl"><div class="cap_box_ttl"><span>最初の一歩</span></div><div class="cap_box_content">
<p class="wp-block-paragraph">「何から補強するか」で迷うなら、買い切りで気軽に始められるColosoで弱点を1つ埋めるところからが動きやすいです</p>



<figure class="wp-block-image"><a href="https://px.a8.net/svt/ejp?a8mat=4B41ZJ+4MPFPE+5Q4A+5Z6WX" rel="nofollow">
<img decoding="async" border="0" width="468" height="60" alt="" src="https://www23.a8.net/svt/bgt?aid=260529679280&#038;wid=003&#038;eno=01&#038;mid=s00000026713001004000&#038;mc=1"></a><img decoding="async" border="0" width="1" height="1" src="https://www19.a8.net/0.gif?a8mat=4B41ZJ+4MPFPE+5Q4A+5Z6WX" alt="">



<div class="swell-block-button is-style-btn_solid"><a href="https://px.a8.net/svt/ejp?a8mat=4B41ZJ+4MPFPE+5Q4A+5Z6WX" rel="noopener noreferrer" class="swell-block-button__link"><span>Colosoで弱点を補強する</span></a></div>
</div></div>


<p><!--
公開前チェックリスト:
- [ ] loos/button 4か所の hrefUrl と <a href> を実アフィリンクに差し替え（Coloso×2 / Python Winner×1 / SHIFT TERAS×1〔もしも・バナー可〕）
- [ ] 料金・給付金（SHIFT TERAS 最大80%/上限64万、Python Winner 給付金、Coloso 講座ごと）が公開時点でズレていないか公式で確認
- [ ] アイキャッチ画像を設定（Pythonカテゴリ）
- [ ] 新規タグ「転職」がWPに作成済みか確認
- [ ] status を publish に変更 → 公開後 GSC URL検査で手動リクエスト
--></p>

<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/python-career-change/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】TeamsにWebhookで自動通知する方法【2026年版】</title>
		<link>https://javeo.jp/teams-notify/</link>
					<comments>https://javeo.jp/teams-notify/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Fri, 05 Jun 2026 14:38:43 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[Teams]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/teams-notify/</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/teams-notify-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>PythonでTeamsに自動通知 旧Incoming Webhookの廃止を受けて、Power Automate WorkflowsのWebhookにAdaptive CardをPOSTする手順とサンプルコードまでまとめました]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/teams-notify-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">Pythonでバッチを組むと、処理結果やエラーをどこかに通知したくなります、メールだと埋もれがちなので、普段使っているチャットに飛ばしておくと見落としが減って便利です</p>



<p class="wp-block-paragraph">会社のやり取りがTeams中心なら、Teamsに通知できると確認の手間が減ります、ただ少し前まで手軽だった<strong>Incoming Webhook</strong>(Office 365 コネクタ)は段階的に廃止が進んでいて、新しく作るなら今は<strong><span class="swl-marker mark_yellow">Power Automate Workflows</span></strong>で用意するのが公式の推奨です</p>



<p class="wp-block-paragraph">以前<a href="https://javeo.jp/chatwork-notify/" target="_blank" rel="noopener noreferrer">ChatworkにPythonから通知する記事</a>を書きましたが、今回はそのTeams版です、Workflowsで発行したWebアドレスにPythonからJSONをPOSTするだけなので、流れはChatworkのときと近いです、この記事ではWebhookの作り方から実際に送るサンプルコードまでまとめてご紹介します</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">難しいプログラムは要りません、Workflowsで1つWebhookを作って、Pythonから数行POSTするだけなので身構えなくて大丈夫です</p>
</div></div>



<h2 class="wp-block-heading">Teams通知の仕組み</h2>



<p class="wp-block-paragraph">先に全体像をつかんでおきます、やることはシンプルで、<strong>Workflows</strong>で作った<strong>Webhook URL</strong>(専用のWebアドレス)宛てに、Pythonからメッセージの中身をJSONでPOSTすると、指定したチャネルにカードとして投稿される、という流れです</p>



<ul class="wp-block-list is-style-num_circle -list-under-dashed">
<li>Teamsの<strong>Workflows</strong>でWebhookを作る(Webhook URLが発行される)</li>



<li>Pythonからその<strong>Webhook URL</strong>にメッセージをJSONでPOSTする</li>



<li>指定したチャネルにメッセージが投稿される</li>
</ul>



<p class="wp-block-paragraph">送るデータの形は<strong><span class="swl-marker mark_yellow">Adaptive Card</span></strong>という、Teamsが受け取れるカード形式のJSONです、見た目はあとから整えられますが、まずは1行のメッセージを送るところから作っていきます</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">昔の<strong>Incoming Webhook</strong>は宛先のURLさえ知っていれば誰でも投稿できる作りで、セキュリティ面が心配されていました、Workflowsは作った人のフロー(自動処理)を経由して投稿する形になっていて、そのあたりが置き換わった理由とされています</p>
</div></div>



<h2 class="wp-block-heading">WorkflowsでWebhookを作る</h2>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">はじめに前提です、Workflows(Power Automate)を使うには<strong><span class="swl-marker mark_yellow">職場または学校アカウント(Microsoft 365)</span></strong>が必要です、個人用のMicrosoftアカウント(outlook.comなど)ではPower Automateが使えず、WorkflowsアプリがTeamsのメニューに出てこないので、会社や学校のTeamsで用意してください</p>
</div></div>



<p class="wp-block-paragraph">まずはTeams側でWebhookを用意します、公式に用意されているテンプレートを選ぶだけなので、プログラムの知識は要りません、手順は次のとおりです</p>



<div class="swell-block-step" data-num-style="circle">
<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">Workflowsアプリを開く</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">Teamsの左側のメニューから<strong><span class="swl-marker mark_yellow">Workflows</span></strong>アプリを開きます、見当たらないときは左メニューの一番下にある<strong>アプリ</strong>から<strong>Workflows</strong>を検索すると出てきます</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">テンプレートを選ぶ</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">テンプレートの一覧から<strong><span class="swl-marker mark_yellow">Webhook 要求を受信したらチャネルに投稿する</span></strong>(英語表記だと Post to a channel when a webhook request is received)を選びます</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">フロー名を入力する</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">このWebhookの名前(フロー名)を入力します、あとから自分が見て分かればいいので、バッチ通知用のような名前を付けておくと管理が楽です</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">投稿先のチームとチャネルを選ぶ</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">通知を流したい<strong>チーム</strong>と<strong>チャネル</strong>を選びます、ここで選べるのは<strong><span class="swl-marker mark_yellow">標準チャネル</span></strong>だけなので、非公開チャネルやチャットには直接送れない点に気をつけてください</p>
</div></div>



<div class="swell-block-step__item"><div class="swell-block-step__number u-bg-main"><span class="__label">STEP</span></div><div class="swell-block-step__title u-fz-l">Webhook URLをコピーして控える</div><div class="swell-block-step__body">
<p class="wp-block-paragraph">作成すると<strong><span class="swl-marker mark_yellow">Webhook URL</span></strong>が発行されます、このURL宛てにPythonからPOSTする形になるので、コピーして控えておきます、画面を閉じたあとに確認したいときは、Workflowsアプリの一覧から該当のフローを開いて見られます</p>
</div></div>
</div>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">発行された<strong><span class="swl-marker mark_yellow" style="color:#e8313b">Webhook URLはパスワードと同じ</span></strong>です、このURLを知っていれば該当チャネルに投稿できてしまうので、人に教えたりGitHubなどの公開リポジトリにそのまま載せたりしないように気をつけてください</p>
</div></div>



<h2 class="wp-block-heading">Pythonのプログラム</h2>



<p class="wp-block-paragraph">Webhook URLが用意できたら、あとはPythonから送るだけです、URLはコードに直書きせず<strong>.env</strong>ファイルから読み込む形にしています、こうしておけば値を差し替えるのも楽ですし、うっかり鍵を公開してしまう事故も防げます</p>



<p class="wp-block-paragraph">まず読み込みに使う<strong>python-dotenv</strong>を入れておきます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>pip install python-dotenv</code></pre></div>



<p class="wp-block-paragraph">次にプロジェクトの直下に<strong>.env</strong>を作って、さっき発行された<strong>Webhook URL</strong>を書いておきます、変数名は<strong>TEAMS_WEBHOOK_URL</strong>にして、値だけ(URLそのもの)を書きます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>TEAMS_WEBHOOK_URL=発行されたWebhook URL</code></pre></div>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">作った<strong>.env</strong>は<strong>.gitignoreに入れて</strong>、GitHubなどにアップしないようにしておきます、.gitignoreはGitに「このファイルは管理しないでね(=GitHubにもアップしないでね)」と伝えるためのリストです、これで鍵をコードに直書きせず、リポジトリにも残さずに済みます</p>
</div></div>



<p class="wp-block-paragraph">本体のコードがこちらです、ステータスコードが200か202かどうかで送信成功を True・False で返すようにしています</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import os

import requests
from dotenv import load_dotenv

load_dotenv()
TEAMS_WEBHOOK_URL = os.environ[&quot;TEAMS_WEBHOOK_URL&quot;]


def send_to_teams(message, webhook_url=TEAMS_WEBHOOK_URL) -&gt; bool:
    payload = {
        &quot;type&quot;: &quot;message&quot;,
        &quot;attachments&quot;: [
            {
                &quot;contentType&quot;: &quot;application/vnd.microsoft.card.adaptive&quot;,
                &quot;content&quot;: {
                    &quot;$schema&quot;: &quot;http://adaptivecards.io/schemas/adaptive-card.json&quot;,
                    &quot;type&quot;: &quot;AdaptiveCard&quot;,
                    &quot;version&quot;: &quot;1.4&quot;,
                    &quot;body&quot;: [
                        {&quot;type&quot;: &quot;TextBlock&quot;, &quot;text&quot;: message, &quot;wrap&quot;: True},
                    ],
                },
            }
        ],
    }
    response = requests.post(webhook_url, json=payload)
    return response.status_code in (200, 202)</code></pre></div>



<p class="wp-block-paragraph">やっていることはシンプルで、発行された<strong>Webhook URL</strong>に対して、メッセージを入れたJSONをPOSTするだけです、送るJSONはトップに type として message を置いて、その中の attachments に<strong>Adaptive Card</strong>を入れる、という決まった形になっています、引数のmessageがそのまま<strong>TextBlock</strong>の本文として表示されます</p>



<p class="wp-block-paragraph">送り方のポイントが2つあります、まず<strong>json=</strong>でデータを渡すと、Content-Typeが<strong>application/json</strong>に自動で設定されるので、ヘッダーを手で書く必要はありません、認証についても<strong><span class="swl-marker mark_yellow">Webhook URL自体に署名が含まれている</span></strong>ので、追加の認証ヘッダやトークンは不要です</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">成功したときのステータスコードは<strong><span class="swl-marker mark_yellow" style="color:#e8313b">202(Accepted)</span></strong>です、Chatworkなどは200が返りますが、WorkflowsのWebhookは受け付けてから裏で処理する作りなので、200ではなく202が返ってきます、なので成功判定は200と202のどちらかなら成功、としています</p>
</div></div>



<p class="wp-block-paragraph">あとは <strong>send_to_teams(&#39;通知したいメッセージ&#39;)</strong> のように呼べば、バッチの好きなタイミングで通知できます、処理が終わったタイミングや、例外を捕まえたタイミングで呼ぶと、結果やエラーをそのままTeamsに流せます</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph"><strong>TextBlock</strong>の<strong>text</strong>には、太字や斜体、リンクといった一部のmarkdownが使えます、見出しや改行で少し見やすくする程度なら十分です、ただ画像やコードブロックは別の要素を組む形になるので、ここでは1行のテキストを送る範囲にとどめています</p>
</div></div>



<h2 class="wp-block-heading">使うときの注意点</h2>



<p class="wp-block-paragraph">つまずきやすいところを先にまとめておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>投稿先に選べるのは<strong>標準チャネル</strong>だけ(非公開チャネルやチャットには直接送れない)</li>



<li>旧<strong>Incoming Webhook</strong>は廃止される流れなので、これから作るなら<strong>Workflows</strong>で用意する</li>



<li>成功のステータスコードは<strong>200ではなく202</strong>になることがある</li>



<li>利用には<strong>職場・学校アカウント(Microsoft 365)</strong>が必要(個人アカウントではWorkflowsが使えない)</li>
</ul>



<p class="wp-block-paragraph">旧<strong>Incoming Webhook</strong>(Office 365 コネクタ)は段階的に廃止が進められてきて、公式の最新案内では<strong><span class="swl-marker mark_yellow">2026年5月の更新で最終的な廃止</span></strong>とされています、期限は過去に何度も後ろ倒しされてきた経緯がありますが、これから新しく作るなら使えない前提で考えておくのが安全なので、Workflowsで用意するのが確実です、既存のWebhookがある人も最新の案内を確認しつつ早めに移しておくと安心です</p>



<p class="wp-block-paragraph">権限まわりは環境によります、Power Automateは多くのMicrosoft 365環境で使えますが、組織の設定によってはWorkflowsの作成が制限されていることもあります、テンプレートが選べない、作成でエラーが出るといったときは、組織の管理者に確認してみてください</p>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">ループの中で大量に送るような使い方は避けて、処理結果やエラーの要点だけ送るくらいがちょうどいいです、短時間に送りすぎると制限がかかることもあるので、通知は要点をまとめて1回、を意識しておくと安全です</p>
</div></div>



<h2 class="wp-block-heading">公式ドキュメント</h2>



<p class="wp-block-paragraph">もう少し踏み込みたいときは、↓の公式ドキュメントが参考になります、Workflowsからカードを投稿する話や、コネクタ廃止の経緯がまとまっています</p>



<ul class="wp-block-list -list-under-dashed">
<li><a href="https://learn.microsoft.com/ja-jp/power-automate/overview-adaptive-cards" target="_blank" rel="noopener noreferrer">Microsoft Teams にアダプティブ カードを投稿するフローを作成する｜Microsoft Learn</a></li>



<li><a href="https://devblogs.microsoft.com/microsoft365dev/retirement-of-office-365-connectors-within-microsoft-teams/" target="_blank" rel="noopener noreferrer">Retirement of Office 365 connectors within Microsoft Teams｜Microsoft 365 Developer Blog</a></li>
</ul>



<h2 class="wp-block-heading">あとがき</h2>



<p class="wp-block-paragraph">仕事のやり取りがTeams中心なら、処理結果やエラーがそのまま流れてくると見落としがぐっと減ります、Webhookを1つ作ってしまえば、あとはPythonから呼ぶだけなので、一度組んでおくと使い回しが効きます</p>



<p class="wp-block-paragraph">同じ要領でChatworkに通知したい方は、<a href="https://javeo.jp/chatwork-notify/" target="_blank" rel="noopener noreferrer">PythonからChatworkに自動通知する記事</a>もあわせてどうぞ、APIトークンとルームIDの取り方からまとめています、送り先が違うだけで、Pythonから通知する考え方は今回とほぼ同じです</p>



<p class="wp-block-paragraph">Pythonの自動化つながりだと、<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Selenium WebDriverWaitの使い方</a>でスクレイピングを安定させて、その結果をこのTeams通知に流す、といった組み合わせも便利です、作ったスクリプトを配りたいときは、<a href="https://javeo.jp/decompile-pyinstaller/" target="_blank" rel="noopener noreferrer">PyInstallerでexe化する話</a>もどうぞ</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/teams-notify/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】GoogleスプレッドシートAPI連携！秘密鍵（サービスアカウントキー）の取得方法を解説</title>
		<link>https://javeo.jp/spreadsheets-api-key/</link>
					<comments>https://javeo.jp/spreadsheets-api-key/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Thu, 23 Oct 2025 13:35:36 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3630</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2023/10/Google-Cloud-Platform-1024x538.png" class="webfeedsFeaturedVisual" /></p>前提としてGoogleアカウントが必要になりますが大半の人はすでに作成していると思うのでここでは割愛・・・ まずはGCP（Google Cloud Platform）アカウントを作成 アカウント作成のためにGoogle  [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2023/10/Google-Cloud-Platform-1024x538.png" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p class="wp-block-paragraph">プログラムでスプレッドシートを操作するためにはAPIを利用する必要があって、このAPIを利用するためには秘密鍵ファイルをGoogleアカウントベースで作成する必要があります</p>



<p class="wp-block-paragraph">つまり誰かに準備してもらうのではなく、利用者自身で作成する必要があるので今回はこの秘密鍵ファイルの取得方法をまとめていきます</p>
</div>



<p class="wp-block-paragraph">前提としてGoogleアカウントが必要になりますが大半の人はすでに作成していると思うのでここでは割愛・・・</p>



<h2 class="wp-block-heading">まずはGCP（Google Cloud Platform）アカウントを作成</h2>



<p class="wp-block-paragraph">アカウント作成のために<a href="https://cloud.google.com" data-type="link" data-id="https://cloud.google.com" target="_blank" rel="noreferrer noopener">Google Cloud</a>ページへ</p>



<p class="wp-block-paragraph">&#8220;<strong>無料で利用開始</strong>&#8220;ボタンをクリックしそうなんですが&#8221;<a href="https://console.cloud.google.com/" data-type="link" data-id="https://console.cloud.google.com/?_ga=2.231002207.-1558698147.1716213606" target="_blank" rel="noreferrer noopener nofollow">コンソール</a>&#8220;リンクの方をクリック</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/image-4-1.jpg"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/image-4-1-1024x550.jpg" alt="" class="wp-image-3648" srcset="https://javeo.jp/wp-content/uploads/2025/10/image-4-1-1024x550.jpg 1024w, https://javeo.jp/wp-content/uploads/2025/10/image-4-1-300x161.jpg 300w, https://javeo.jp/wp-content/uploads/2025/10/image-4-1-150x81.jpg 150w, https://javeo.jp/wp-content/uploads/2025/10/image-4-1-768x413.jpg 768w, https://javeo.jp/wp-content/uploads/2025/10/image-4-1-1536x826.jpg 1536w, https://javeo.jp/wp-content/uploads/2025/10/image-4-1.jpg 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">初めて開く場合は&#8221;<span class="marker-under"><strong>利用規約への同意</strong></span>&#8220;と&#8221;更新情報をメールで受信希望&#8221;を聞かれるので利用規約は必須でチェック</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35-1024x550.png" alt="" class="wp-image-3633" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h39_35.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">ここまででGoogle Cloudのアカウント作成完了できたので続いて無料トライアルへ</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/image.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/image-1024x550.png" alt="" class="wp-image-3635" srcset="https://javeo.jp/wp-content/uploads/2025/10/image-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/image-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/image-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/image-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/image-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/image.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">国を選んで</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06-1024x550.png" alt="" class="wp-image-3636" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h41_06.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">連絡先（住所）を登録して</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40-1024x550.png" alt="" class="wp-image-3638" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h42_40.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">支払い方法（クレジットカード情報）を登録して</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/image-1.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/image-1-1024x550.png" alt="" class="wp-image-3642" srcset="https://javeo.jp/wp-content/uploads/2025/10/image-1-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/image-1-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/image-1-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/image-1-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/image-1-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/image-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/image-2.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/image-2-1024x550.png" alt="" class="wp-image-3643" srcset="https://javeo.jp/wp-content/uploads/2025/10/image-2-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/image-2-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/image-2-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/image-2-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/image-2-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/image-2.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">利用開始！</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/image-3.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/image-3-1024x550.png" alt="" class="wp-image-3644" srcset="https://javeo.jp/wp-content/uploads/2025/10/image-3-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/image-3-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/image-3-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/image-3-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/image-3-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/image-3.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">続いてプロジェクトを作成</h2>



<p class="wp-block-paragraph">アカウントに続いてプロジェクトを作成します</p>



<p class="wp-block-paragraph">手順は下記の通り</p>



<ol class="wp-block-list has-watery-yellow-background-color has-background">
<li>&#8220;<strong>プロジェクトの選択</strong>&#8220;をクリック</li>



<li>&#8220;<strong>新しいプロジェクト</strong>&#8220;をクリック</li>



<li>&#8220;<strong>プロジェクト名</strong>&#8220;を適当に登録</li>



<li>&#8220;<strong>作成</strong>&#8220;ボタンをクリック</li>
</ol>



<p class="wp-block-paragraph">&#8220;<strong>場所</strong>&#8220;は大半の人は&#8221;組織なし&#8221;のままでOK</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1.png"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1-1024x555.png" alt="" class="wp-image-2178" srcset="https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1-1024x555.png 1024w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1-300x163.png 300w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1-150x81.png 150w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1-768x416.png 768w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1-1536x832.png 1536w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h18_48-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">プロジェクトの作成完了にもう一度&#8221;<strong>プロジェクトの選択</strong>&#8220;をクリックすると先ほど作成したプロジェクトがあるので選択しておく</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07.png"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07-1024x555.png" alt="" class="wp-image-2179" srcset="https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07-1024x555.png 1024w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07-300x163.png 300w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07-150x81.png 150w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07-768x416.png 768w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07-1536x832.png 1536w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-20_23h23_07.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">ようやくAPIの設定</h2>



<p class="wp-block-paragraph">トップメニューで左上のハンバーガーからメニューを表示させて&#8221;<strong><span class="marker-under">APIとサービス</span></strong>&#8220;→&#8221;<strong><span class="marker-under">ライブラリ</span></strong>&#8220;でメニューを表示する</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49-1024x550.png" alt="" class="wp-image-3655" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h52_49.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">APIライブラリの中からスプレッドシート操作に必要な&#8221;<span class="marker-under">Google Drive</span>&#8220;と&#8221;<strong><span class="marker-under">Google Sheets API</span></strong>&#8220;を選択</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34-1024x550.png" alt="" class="wp-image-3673" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-25_00h54_34.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">有効化はボタンをクリックだけの簡単仕様</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00-1024x550.png" alt="" class="wp-image-3653" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h54_00.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">次はサービスアカウントの作成</h2>



<p class="wp-block-paragraph">PythonなどのプログラムからGCPのリソースにアクセスする際には、「サービスアカウント」という特別なアカウントを利用します</p>



<p class="wp-block-paragraph">サービスアカウントは人間が使うGoogleアカウントとは異なり、プログラムがGCPと安全にやり取りするための専用アカウントみたいなものです</p>



<p class="wp-block-paragraph">再びハンバーガーメニューから&#8221;<strong><span class="marker-under">IAM と 管理</span></strong>&#8220;→&#8221;<strong><span class="marker-under">サービス アカウント</span></strong>&#8220;へ</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22-1024x538.png" alt="" class="wp-image-3654" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22-300x158.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22-768x404.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22-1536x807.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-19_14h03_22.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">&#8220;<strong><span class="marker-under">サービスアカウント名</span></strong>&#8220;をお好みで入力すると勝手に&#8221;<strong>サービスアカウントID</strong>&#8220;が生成されるのでそのまま&#8221;<strong>作成して続行</strong>&#8220;をクリック</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09-1024x550.png" alt="" class="wp-image-3657" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h43_09.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">※権限とアクセス権を持つプリンシパルは表記の通り省略可なのでこの場はスルーで完了を</p>



<h3 class="wp-block-heading">最後に鍵ファイルを作成</h3>



<p class="wp-block-paragraph">またまたハンバーガーメニューから&#8221;<strong><span class="marker-under">IAM と 管理</span></strong>&#8220;→&#8221;<strong><span class="marker-under">認証情報</span></strong>&#8220;へ</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1-1024x550.png" alt="" class="wp-image-3663" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_10h56_00-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">先ほど作成したサービスアカウント情報を見つつ、右側の&#8221;サービスアカウントを管理&#8221;をクリック</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1-1024x550.png" alt="" class="wp-image-3665" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h48_46-1.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">三点リーダーをクリックして&#8221;鍵を管理&#8221;を選択</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48-1024x550.png" alt="" class="wp-image-3668" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h55_48.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">キーを追加をクリックすると鍵のタイプを選ぶメニューが表示されるのでデフォルトのJSONのまま右下の作成をクリック</p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12.png"><img decoding="async" width="1024" height="550" src="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12-1024x550.png" alt="" class="wp-image-3669" srcset="https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12-1024x550.png 1024w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12-300x161.png 300w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12-150x81.png 150w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12-768x413.png 768w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12-1536x826.png 1536w, https://javeo.jp/wp-content/uploads/2025/10/2025-10-18_11h56_12.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">パソコンにサービスアカウントIDの一部がファイル名に含まれたJSONファイルが自動ダウンロードされて完了！！</p>



<h2 class="wp-block-heading">最後にスプレッドシートを共有</h2>



<p class="wp-block-paragraph">あとは対象のスプレッドシートのURLや参照・更新してほしい情報を伝えるだけですがこのままではプログラムでエラーが起こります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>例外が発生しました: PermissionError
{&#39;code&#39;: 403, &#39;message&#39;: &#39;The caller does not have permission&#39;, &#39;status&#39;: &#39;PERMISSION_DENIED&#39;}
gspread.exceptions.APIError: {&#39;code&#39;: 403, &#39;message&#39;: &#39;The caller does not have permission&#39;, &#39;status&#39;: &#39;PERMISSION_DENIED&#39;}

The above exception was the direct cause of the following exception:

  File &quot;C:\Users\thosh\デスクトップ\python\mercari.py&quot;, line 9, in &lt;module&gt;
    sheet = gc.open_by_url(&#39;https://docs.google.com/spreadsheets/d/1cT_wQXpv0wfsMakmGtOq2tkd4htSwvMDDbsbgVPe3MQ/edit#gid=0&#39;).worksheet(&#39;テストシート&#39;)
PermissionError: </code></pre></div>



<p class="wp-block-paragraph">原因はエラーにも書いてある通り&#8221;許可&#8221;されていないんですね</p>



<p class="wp-block-paragraph">何の許可かと言えばスプレッドシート自体の閲覧or編集許可なんでファイルの共有設定から参照してもらうだけなら&#8221;<strong>閲覧者</strong>&#8220;、実際に操作してもらうなら&#8221;<strong>編集者</strong>&#8220;で設定しましょう</p>



<p class="wp-block-paragraph"><span class="bold-red">ここまでくればPythonでスプレッドシートの操作ができます！！</span></p>



<figure class="wp-block-image size-large"><a href="https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22.png"><img decoding="async" width="1024" height="555" src="https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22-1024x555.png" alt="" class="wp-image-2222" srcset="https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22-1024x555.png 1024w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22-300x163.png 300w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22-150x81.png 150w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22-768x416.png 768w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22-1536x832.png 1536w, https://javeo.jp/wp-content/uploads/2024/05/2024-05-22_22h06_22.png 1920w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h2 class="wp-block-heading">あとがき</h2>



<p class="wp-block-paragraph">Pythonでのスプレッドシート操作自体は難しくないのですがここまでの事前準備がが結構面倒くさい・・</p>



<p class="wp-block-paragraph">信頼できる発注先なら相手のGoogle Driveで運用してもらって共有設定してもらうのもありじゃないでしょうか</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/spreadsheets-api-key/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】Seleniumの基本操作はラップしよ</title>
		<link>https://javeo.jp/selenium-wrapper/</link>
					<comments>https://javeo.jp/selenium-wrapper/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sun, 28 Sep 2025 07:49:00 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3604</guid>

					<description><![CDATA[前提 後続のプログラムは下記前提で作成していますので classと__init__などの初期値は下記の通り 内部関数たち driverのオープンとクローズ 兎にも角にもchromedriverを動かさないと話にならないの [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-cocoon-blocks-info-box block-box primary-box">
<p class="wp-block-paragraph">ブラウザ操作と言えばのSeleniumですが、便利だけど絶妙に使いにくくないですか？</p>



<p class="wp-block-paragraph">素直に使おうとするとブラウザ処理をPythonの処理が追い越してしまってエラーになるなんてよくある話</p>



<p class="wp-block-paragraph">そんな悩みを解決するためにもラッパーを作って快適に利用したいね、ってことて最近個人的に作ってみたラッパーのご紹介です</p>



<p class="wp-block-paragraph">素人作りなのでそのまま使うと言うよりこれらをベースにいい感じに改良してくれれば（そしてコメントで教えてくれると嬉しいです）</p>
</div>



<h2 class="wp-block-heading">前提</h2>



<p class="wp-block-paragraph">後続のプログラムは下記前提で作成していますので</p>



<p class="wp-block-paragraph">classと__init__などの初期値は下記の通り</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import logging
import time
import os
import sys
import atexit
from typing import Optional, Callable
from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.remote.webelement import WebElement
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait, Select
from enum import Enum


# selectをわかりやすくするだけ
class SelectBy(Enum):
    Index = &#39;index&#39;
    Value = &#39;value&#39;
    VisibleText = &#39;visible_text&#39;

class SeleniumWrapper:
    def __init__(self, timeout=10, log_level=logging.INFO):
        # ログ設定
        logging.basicConfig(
            format=&#39;[%(asctime)s] %(levelname)s: %(message)s&#39;,
            level=log_level
        )
        self.logger = logging.getLogger(__name__)
        self.timeout = timeout
        self.logger.info(&quot;SeleniumWrapper initialized&quot;)
        self.selenium_flg = False
        atexit.register(self.driver_close) </code></pre></div>



<h2 class="wp-block-heading">内部関数たち</h2>



<p class="wp-block-paragraph"></p>



<ul class="wp-block-list">
<li>対象の要素を画面の中央に持ってくる（_scroll_to_center）</li>



<li>Timeoutの値チェック（_resolve_timeout）</li>



<li>クリック処理をSeleniumでエラーになったときjsでもう一回試みる（_safe_click）</li>



<li>WebElementをIndex指定で取得する（_get_element_by_index）</li>
</ul>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    def _scroll_to_center(self, element: WebElement) -&gt; bool:
        &#39;&#39;&#39;
        memo:
        -----------
        - jsで指定の要素を画面中央にする
        &#39;&#39;&#39;
        try:
            self.driver.execute_script(&quot;arguments[0].scrollIntoView({ behavior: &#39;smooth&#39;, block: &#39;center&#39; });&quot;, element)
            # 最後に画面表示確認する
            self.selenium_wait(condition=EC.element_to_be_clickable(element))
        except Exception as e:
            self.logger.error(f&#39;[ScrollError] Failed to scroll element: {str(e)}&#39;, exc_info=True)
            return False
        return True

    def _resolve_timeout(self, timeout: float) -&gt; float:
        &#39;&#39;&#39;
        memo:
        -----------
        - タイムアウトを引数初期値（-1）ならinitの値にする
        &#39;&#39;&#39;
        return timeout if timeout != -1 else self.timeout

    def _safe_click(self, element: WebElement) -&gt; bool:
        &#39;&#39;&#39;
        memo:
        -----------
        - selenium標準のclickが失敗したらjsでクリックをする2段構えclick
        &#39;&#39;&#39;
        try:
            element.click()
        except Exception as e:
            try:
                self.driver.execute_script(&#39;arguments[0].click();&#39;, element)
            except Exception as e2:
                self.logger.error(f&#39;[ClickError] JS click failed: {str(e2)}&#39;, exc_info=True)
                return False
        return True

    def _get_element_by_index(self, css_selector: str, idx: int = 0, timeout: float = -1) -&gt; Optional[WebElement]:
        &#39;&#39;&#39;
        Parameters:
        -----------
        css_selector:遷移先のURL
        timeout:WebDriverWaitの最大待機秒数
        condition:expected_conditions

        memo:
        -----------
        - elementをidx指定で取得するのでEC.presence_of_all_elements_locatedを使う
        - css_selectorがconditionの状態になるまで待機
        &#39;&#39;&#39;
        timeout = self._resolve_timeout(timeout)
        try:
            elements = WebDriverWait(self.driver, timeout).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, css_selector)))
            if len(elements) &lt;= idx:
                self.logger.warning(f&#39;[NoSuchElement] selector={css_selector}, index={idx}&#39;)
                return None
        except TimeoutException:
            self.logger.warning(f&#39;[Timeout] selector={css_selector}, timeout={timeout}&#39;)
            return None
        except Exception as e:
            self.logger.error(f&#39;[Exception] selector={css_selector}, index={idx}, error={str(e)}&#39;, exc_info=True)
            return None
        return elements[idx]</code></pre></div>



<h2 class="wp-block-heading">driverのオープンとクローズ</h2>



<p class="wp-block-paragraph">兎にも角にもchromedriverを動かさないと話にならないので</p>



<p class="wp-block-paragraph">オプションはかなりの量があるのでお好みでカスタマイズを</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    def driver_open(self, headless: bool = False) -&gt; None:
        &#39;&#39;&#39;
        Parameters:
        -----------
        headless:ヘッドレスモードで実行するか

        memo:
        -----------
        - chromedriverを起動する
        - なるべくchromedriver感を隠す
        &#39;&#39;&#39;
        options = Options()
        ##### 共通オプション
        options.add_argument(&#39;--start-maximized&#39;)                                   # 初期のウィンドウ最大化
        options.add_argument(&quot;--disable-blink-features=AutomationControlled&quot;)       # navigator.webdriver=false となる設定。確認⇒　driver.execute_script(&quot;return navigator.webdriver&quot;)
        options.add_experimental_option(&quot;excludeSwitches&quot;, [&quot;enable-automation&quot;])   # Chromeは自動テスト ソフトウェア~~　を非表示
        prefs = {
            &quot;credentials_enable_service&quot;: False,                                    # パスワード保存のポップアップを無効
            &quot;download_bubble.partial_view_enabled&quot;: False,                          # ダウンロードが完了したときの通知(吹き出し/下部表示)を無効にする。
            &quot;plugins.always_open_pdf_externally&quot;: True,                             # Chromeの内部PDFビューアを使わない(＝URLにアクセスすると直接ダウンロードされる)
        }
        ##### 引数で指定するオプション
        # ダウンロード先フォルダが指定されてればフォルダを作ってパラメータを追加する
        # ヘッドレスモードの判定
        if headless is True:
            options.add_argument(&#39;--headless=new&#39;) 
        options.add_experimental_option(&quot;prefs&quot;, prefs)
        service = Service()
        service.creation_flags = 0x08000000                                         # ヘッドレスモードで DevTools listening on ws:~~ を表示させない
        self.driver = webdriver.Chrome(service=service, options=options)
        self.driver.maximize_window()
        self.selenium_flg = True
        self.logger.info(&quot;WebDriver started&quot;)

    def driver_close(self):
        &#39;&#39;&#39;
        chromedriverを終わらせる処理
        &#39;&#39;&#39;
        self.logger.info(&quot;Quitting WebDriver&quot;)
        if self.selenium_flg:
            try:
                self.driver.close()
                self.driver.quit()
            except Exception:
                pass
        self.selenium_flg = False</code></pre></div>



<h2 class="wp-block-heading">ページ読み込み完了の検知</h2>



<p class="wp-block-paragraph">全ての動作に入れるべき処理がこれ</p>



<p class="wp-block-paragraph">動的ページが当然なのでjsの完了を検知してあげたり、要素の出現や変化を検知してあげる必要があります</p>



<p class="wp-block-paragraph">さらに、、、理屈は分かりませんが、明示的な待機をしても低確率でPython側の処理が先行する謎事象が発生するので固定でほんの少しだけ待機してあげると安定します</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="selenium_wait" data-lang="Python"><code>    def selenium_wait(self, condition: Any = EC.presence_of_element_located((By.CSS_SELECTOR, &#39;body&#39;)),
                      timeout: float = 10.0, 
                      final_wait_time: float = COMMON_WAIT_SECONDS                      
                     ) -&gt; bool:
        &#39;&#39;&#39;
        Parameters:
        -----------
        condition:expected_conditions ※指定がなければbodyがあることを確認する
        timeout:WebDriverWaitの最大待機秒数
        final_wait_time:最後にsleepする秒数

        memo:
        -----------
        - getだけじゃなくclickとかの後でも使えるようにwait部分だけの関数にする
        &#39;&#39;&#39;
        timeout = self._resolve_timeout(timeout=timeout)
        try:
            # JavaScriptを使ってページ全体が読み込まれるまで待機
            wait = WebDriverWait(self.driver, timeout)
            # JavaScriptの読み込み完了を待つ
            wait.until(lambda d: d.execute_script(&quot;return document.readyState&quot;) == &quot;complete&quot;)
            # ロード完了後に指定のCSSが読み込まれたか確認する ※初期値のbodyはさすがにあるでしょ
            wait.until(condition)
            # 最後に無条件待機を入れる
            time.sleep(final_wait_time)
        except Exception as e:
            # おそらく発生しないException
            self.logger.error(f&#39;[WaitError] Failed during wait: {str(e)}&#39;, exc_info=True)
            return False
        return True</code></pre></div>



<h2 class="wp-block-heading">ページ遷移</h2>



<p class="wp-block-paragraph">わざわざ関数にする必要あるのかって気もしますが・・・</p>



<p class="wp-block-paragraph">getの後に先ほどのselenium_waitをしてあげるだけ</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="selenium_page_load" data-lang="Python"><code>    def selenium_page_load(self, url: str, condition: Any = EC.presence_of_element_located((By.CSS_SELECTOR, &#39;body&#39;)), timeout: float = 10.0, final_wait_time: float = COMMON_WAIT_SECONDS) -&gt; bool:
        &#39;&#39;&#39;
        Parameters:
        -----------
        url:遷移先のURL
        timeout:WebDriverWaitの最大待機秒数
        final_wait_time:最後にsleepする秒数
        load_completion_css:読み込み完了を認知するCSS
        condition:expected_conditions

        memo:
        -----------
        - 結局selenium_waitの前にgetしているだけだけど一番頻度が高いので個別に関数化する
        &#39;&#39;&#39;
        try:
            self.driver.get(url=url)
            self.selenium_wait(condition=condition, timeout=timeout, final_wait_time=final_wait_time)
        except Exception:
            return False
        return True</code></pre></div>



<h2 class="wp-block-heading">文字入力</h2>



<p class="wp-block-paragraph">Seleniumで文字入力をするsend_keyは追記処理なので一度クリアする必要があるのと、入力完了後にjs発火が前提のWebサイトがあるので前後処理が大事</p>



<p class="wp-block-paragraph">あとはタグを&#8221;input&#8221; or &#8220;textarea&#8221;でチェックしていますがイレギュラーがあったら修正するかも</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="selenium_input" data-lang="Python"><code>    def selenium_input(self, target: Union[str, WebElement], idx: int = 0, value: str = &#39;&#39;, timeout: float = -1.0) -&gt; bool:
        &#39;&#39;&#39;
        Parameters:
        -----------
        target: CSSセレクタ（str）または WebElement
        idx: セレクタで複数要素がある場合のインデックス
        value: 入力する文字列
        timeout: タイムアウト秒数

        memo:
        -----------
        - targetがstrなら要素取得して入力、WebElementならそのまま入力
        &#39;&#39;&#39;
        timeout = self._resolve_timeout(timeout=timeout)
        # 要素取得
        element: Optional[WebElement] = None
        if isinstance(target, str):
            element = self._get_element_by_index(target, idx, timeout)
        elif isinstance(target, WebElement):
            element = target
        else:
            self.logger.error(f&#39;[InputError] Invalid target type: {type(target)}&#39;)
            return False

        # 要素が見つからなかった場合はFalseを返す
        if element is None:
            return False

        try:
            # 入力可能状態まで待機
            self.selenium_wait(condition=EC.element_to_be_clickable(element), timeout=timeout)

            # タグチェック
            if element.tag_name not in [&#39;input&#39;, &#39;textarea&#39;]:
                self.logger.error(f&#39;[InputError] Invalid tag for input: {element.tag_name}&#39;)
                return False

            # jsで要素を画面中央にスクロール
            self._scroll_to_center(element)
            # 一旦クリアして念のためクリックして入力
            element.clear()
            element.click()
            time.sleep(COMMON_WAIT_SECONDS)
            element.send_keys(value)
            # 入力後にTabキーを送ってフォーカスを外す
            element.send_keys(Keys.TAB)
            time.sleep(COMMON_WAIT_SECONDS)

        except TimeoutException:
            self.logger.error(f&#39;[Timeout] Element not clickable for input: timeout={timeout}&#39;)
            return False
        except Exception as e:
            self.logger.error(f&#39;[Exception] Error in selenium_input: {str(e)}&#39;, exc_info=True)
            return False
        return True</code></pre></div>



<h2 class="wp-block-heading">情報（文字や要素の値）を取得</h2>



<p class="wp-block-paragraph">個人的には情報取得部分はBeautifulsoupでやることが多いのであまりSeleniumでは利用頻度低いのですが、、基本操作だろうということでこれも</p>



<p class="wp-block-paragraph">利用シーンとして文字取得が主になりますが、属性の値を取得することもあると思うので属性を指定できつつ、初期値はtext or valueの値を指定しているので使い勝手は悪くないはず</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="selenium_get" data-lang="Python"><code>    def selenium_get(self, target: Union[str, WebElement], idx: int = 0, att: str = &#39;text_or_value&#39;, timeout: float = -1.0,  default_value: str = &#39;&#39;) -&gt; str:
        &#39;&#39;&#39;
        Parameters:
        -----------
        target: CSSセレクタ（str）または WebElement
        idx:インデックスの指定が必要な場合 ※初期値は0
        att:取得する対象 ※textかattributeに指定する値
        timeout:タイムアウトまでの秒数 ※初期値は別途設定
        default_value: elementが見つからなかった時の返値

        memo:
        -----------
        - 文字だけでなく指定要素の値も取得できるようにする
        - hidden要素の取得もあるのでpresence_of_element_locatedを使う
        - 要素がない時は引数で制御して初期値空白を返すようにしている
        &#39;&#39;&#39;
        timeout = self._resolve_timeout(timeout=timeout)
        # 要素取得
        element: Optional[WebElement] = None
        if isinstance(target, str):
            element = self._get_element_by_index(target, idx, timeout)
        elif isinstance(target, WebElement):
            element = target
        else:
            self.logger.error(f&#39;[InputError] Invalid target type: {type(target)}&#39;)
            return default_value

        # 要素が見つからなかった場合はdefault_valueを返す
        if element is None:
            return default_value                

        try:
            # 引数の属性に合わせて取得
            ret: str
            if att == &#39;text_or_value&#39;:
                # textが空ならvalueを返す
                ret = element.text.strip()
                if not ret:
                    ret = str(element.get_attribute(&#39;value&#39;)).strip()
            elif att == &#39;text&#39;:
                # 明示的にtextが指定された場合はtextしか確認しない
                ret = element.text.strip()
            else:
                # text以外はattの指定にする
                ret = str(element.get_attribute(att)).strip()
        
        except Exception as e:
            self.logger.error(f&#39;[GetError] Failed to get attribute {att}: {str(e)}&#39;, exc_info=True)
            return default_value
        return ret</code></pre></div>



<h2 class="wp-block-heading">クリックする</h2>



<p class="wp-block-paragraph">Seleniumでクリックするには画面上に対象要素がないとエラーになるので事前に画面スクロールしてあげる必要があります</p>



<p class="wp-block-paragraph">あとは稀にSeleniumのクリックが謎エラーになることがあるのでSelenium標準クリックで失敗したら念のためjsでクリック処理をもう一度してみる2段階構造</p>



<p class="wp-block-paragraph">ボタン、ラジオ、チェックボックスなどクリック処理は全てこれでOKだけどis_selectedとかでで現在状態を事前チェックしてあげたほうがベターかも</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="selenium_click" data-lang="Python"><code>    def selenium_click(self, target: Union[str, WebElement], idx: int = 0, timeout: float = -1.0) -&gt; bool:
        &#39;&#39;&#39;
        Parameters:
        -----------
        target: CSSセレクタ（str）または WebElement
        idx:インデックスの指定が必要な場合 ※初期値は0
        timeout:タイムアウトまでの秒数 ※初期値は別途設定

        memo:
        -----------
        - クリックするため事前に画面中央に移動してクリックする
        - seleniumのクリックが失敗したらjsでクリックするように内部関数を呼び出す
        &#39;&#39;&#39;
        timeout = self._resolve_timeout(timeout=timeout)
        # 要素取得
        element: Optional[WebElement] = None
        if isinstance(target, str):
            element = self._get_element_by_index(target, idx, timeout)
        elif isinstance(target, WebElement):
            element = target
        else:
            self.logger.error(f&#39;[InputError] Invalid target type: {type(target)}&#39;)
            return False

        # 要素が見つからなかった場合はFalseを返す
        if element is None:
            return False          

        try:
            # clickしようとしてるから element_to_be_clickable を使う
            self.selenium_wait(condition=EC.element_to_be_clickable(element), timeout=timeout)
        except TimeoutException:
            self.logger.warning(f&#39;[Timeout] Element not clickable: tag={element.tag_name}, timeout={timeout}&#39;)
            return False
        except Exception as e:
            # おそらく発生しないException
            self.logger.error(f&#39;[Exception] Unexpected error in selenium_click_elm: {str(e)}&#39;, exc_info=True)
            return False

        # jsで要素を画面中央にスクロール
        self._scroll_to_center(element=element)
        # clickでエラーになったらjsを試してみる
        return self._safe_click(element)</code></pre></div>



<h2 class="wp-block-heading">プルダウンから選ぶ</h2>



<p class="wp-block-paragraph">条件選択をする際によく利用するプルダウンの変更もSeleniumで操作できます</p>



<p class="wp-block-paragraph">index、value、textのいずれかで指定できますがtextがわかりやすい気がします</p>



<p class="wp-block-paragraph">指定を誤らないように事前準備していた列挙型の&#8221;SelectBy&#8221;で制御してあげるとこがポイント</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-file="selenium_select" data-lang="Python"><code>    def selenium_select(self, target: Union[str, WebElement], idx: int = 0, select_by: SelectBy = SelectBy.VisibleText, value: str = &#39;&#39;, timeout: float = -1.0) -&gt; bool:
        &#39;&#39;&#39;
        Parameters:
        -----------
        target: CSSセレクタ（str）または WebElement
        idx:インデックスの指定が必要な場合 ※初期値は0
        select_by: select_byの値
        value: select_byで指定した値
        timeout:タイムアウトまでの秒数 ※初期値は別途設定

        memo:
        -----------
        入力可能状態まで待機するのでelement_to_be_clickableを使う
        &#39;&#39;&#39;
        timeout = self._resolve_timeout(timeout=timeout)
        # 要素取得
        element: Optional[WebElement] = None
        if isinstance(target, str):
            element = self._get_element_by_index(target, idx, timeout)
        elif isinstance(target, WebElement):
            element = target
        else:
            self.logger.error(f&#39;[InputError] Invalid target type: {type(target)}&#39;)
            return False

        # 要素が見つからなかった場合はFalseを返す
        if element is None:
            return False

        # selectタグ以外は使わないはず ※select以外で正常タグを見つけたときは修正する
        if element.tag_name != &#39;select&#39;:
            self.logger.error(f&#39;[SelectError] Invalid tag for select: {element.tag_name}&#39;)
            return False

        # jsで要素を画面中央にスクロール
        self._scroll_to_center(element=element)

        # 選択可能状態まで待機
        self.selenium_wait(condition=EC.element_to_be_clickable(element))

        # ここから正常時の操作
        select = Select(element)
        try:
            # 引数のselect_byに合わせて選択
            match select_by:
                case SelectBy.Index:
                    select.select_by_index(int(value))
                case SelectBy.Value:
                    select.select_by_value(str(value))
                case SelectBy.VisibleText:
                    select.select_by_visible_text(str(value))
                case _:
                    self.logger.error(f&quot;[SelectError] Invalid select_by value: {select_by}&quot;)
                    return False

        except ValueError as e:
            self.logger.error(f&quot;[SelectError] ValueError during selection by {select_by.name}: {e}&quot;)
            return False

        except Exception as e:
            self.logger.error(f&quot;[SelectError] Failed to select option by {select_by.name}: {e}&quot;, exc_info=True)
            return False

        time.sleep(COMMON_WAIT_SECONDS)
        return True</code></pre></div>



<h2 class="wp-block-heading">画面を少しずつスクロール</h2>



<p class="wp-block-paragraph">WEBサイトによってはlazyなどで遅延読み込みされる仕様になっていることがあるのでスクロースして要素を全て表示させる処理</p>



<p class="wp-block-paragraph">必要になるシーンは多くはないですがあれば便利</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>    def window_scroll(self, step: int=10, delay: float=0.1):
        &#39;&#39;&#39;
        js対応のためにゆっくり画面を一番下にスクロールする
        &#39;&#39;&#39;
        try:
            top = 1
            last_height = self.driver.execute_script(&#39;return document.body.scrollHeight&#39;)
            while top &lt; last_height:
                top = top + step
                self.driver.execute_script(f&#39;window.scrollBy(0, &quot;{str(step)}&quot;)&#39;)
                last_height = self.driver.execute_script(&#39;return document.body.scrollHeight&#39;)
                time.sleep(delay)
        except Exception as e:
            self.logger.error(f&#39;[ScrollError] Failed during window scroll: {str(e)}&#39;, exc_info=True)</code></pre></div>



<h2 class="wp-block-heading">あとがき</h2>



<p class="wp-block-paragraph">Seleniumがあればブラウザ関係はなんでもできるんですが、標準機能だけで戦うにはちょっと足りないので冒頭の繰り返しになりますがラッパーを準備しておくことはかなり重要かと</p>



<p class="wp-block-paragraph">クラウドワークスでRPA/スクレイピングツール作成の案件を多く受注しているので定期的にアップデートしたいと思います</p>
]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/selenium-wrapper/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>SeleniumのOptionsとServiceまとめ【Python】</title>
		<link>https://javeo.jp/chrome-options-service/</link>
					<comments>https://javeo.jp/chrome-options-service/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Sat, 23 Aug 2025 17:07:21 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3418</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/chrome-options-service-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>SeleniumでChromeを起動する前に指定するOptionsとServiceについて、おすすめを目的別にまとめました、Optionsはバージョンアップとともに変わったりするので不定期に更新していきます、2026年6 [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/chrome-options-service-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">SeleniumでChromeを起動する前に指定する<strong>Options</strong>と<strong>Service</strong>について、おすすめを目的別にまとめました、Optionsはバージョンアップとともに変わったりするので不定期に更新していきます、2026年6月時点での最新版です</p>
</div></div>



<h2 class="wp-block-heading">前置き</h2>



<p class="wp-block-paragraph">特にOptionsは動作軽量を目指す機能も多いのですが、スクレイピングはなるべく人が操作している状態を再現したほうが安定するので、<strong><span class="swl-marker mark_yellow">なるべく使わない方がいい</span></strong>が持論です</p>



<p class="wp-block-paragraph">プロファイルを指定しなければ毎回、何も設定していない<strong><span class="swl-marker mark_yellow">インストール直後のピュアな状態</span></strong>で起動するはずなので、その前提で必要な機能だけ選んでいけばいいと思います</p>



<h2 class="wp-block-heading">Optionsについて</h2>



<p class="wp-block-paragraph">いわゆる起動オプションとして、Chromeの機能を設定できます、あくまでChrome用の機能なので「ChromeDriverとして要る？」と思うものもありますが、目的別に分類したので気になるところからチェックしてみてください</p>



<p class="wp-block-paragraph">記述は<strong>options.add_argument(argument: str)</strong>で、必要な分だけ書いていきます、評価はあくまで個人的なものなので、お好みで取捨選択してください</p>



<div class="wp-block-group is-style-big_icon_point"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">数は多いですが全部覚える必要はありません、迷ったら後半の<strong>結局何を使うべきか</strong>のテンプレが基本で、中でもBot検知対策の<strong><span class="swl-marker mark_yellow">&#45;&#45;disable-blink-features=AutomationControlled</span></strong>は入れておくと安定します</p>
</div></div>



<h3 class="wp-block-heading">高速化・軽量化目的</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;headless=new</td><td>画面を表示せず(headless)起動、バックグラウンド処理向き</td><td>一番需要あり、ただしエラーに気づきにくい/サイトによっては弾かれることも(昔の&#45;&#45;headlessでなく今は=new)</td></tr><tr><td>&#45;&#45;disable-gpu</td><td>GPU処理を無効化</td><td>昔の名残、新しいheadless(Chrome 109以降)ではほぼ不要、自分は付けない</td></tr><tr><td>&#45;&#45;disable-extensions</td><td>拡張機能を無効化して起動</td><td>そもそも拡張なしが基本なのであってもなくても</td></tr><tr><td>&#45;&#45;disable-dev-shm-usage</td><td>Linux/Dockerで共有メモリを避けクラッシュ防止</td><td>Windowsなら不要、おまじない枠</td></tr><tr><td>&#45;&#45;no-sandbox</td><td>サンドボックス(セキュリティ)を無効化</td><td>Linuxで必要なことはあるが基本は付けない方がいい</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">テスト・自動化向け</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;start-maximized</td><td>ウィンドウを最大化して起動</td><td>個人的に必須級、小さいと要素が表示されないことがある</td></tr><tr><td>&#45;&#45;window-size=幅,高さ</td><td>ウィンドウサイズを指定して起動</td><td>&#45;&#45;start-maximized推奨だがこちらでもOK</td></tr><tr><td>&#45;&#45;disable-popup-blocking</td><td>ポップアップブロックを無効化</td><td>既定でブロックされないはずなので不要</td></tr><tr><td>&#45;&#45;disable-notifications</td><td>通知を無効化</td><td>通知を受ける操作はしないのであってもなくても</td></tr><tr><td>&#45;&#45;auto-open-devtools-for-tabs</td><td>起動時にDevToolsを自動表示</td><td>完成品には不要、開発は普通のChromeでやるはず</td></tr><tr><td>&#45;&#45;disable-blink-features=AutomationControlled</td><td>navigator.webdriverを偽装して自動化検知を回避</td><td><strong>Bot検知対策の基本、まず入れておきたい</strong>(ただし単体では不十分=後述)</td></tr></tbody></table></figure>



<div class="wp-block-group is-style-big_icon_caution"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph"><strong><span class="swl-marker mark_yellow">2026年はこの手の基本フラグだけではほぼ見抜かれます</span></strong>、ChromeDriverが残すcdc_から始まる変数やCDP(DevTools Protocol)の痕跡、ヘッドレス特有のUA(HeadlessChrome)など、チェックされるポイントは増える一方です、本気で検知を避けたいならundetected-chromedriverのような専用ツールや、痕跡をまとめて潰す対策が前提になります</p>
</div></div>



<h3 class="wp-block-heading">プライバシー・偽装目的</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;incognito</td><td>シークレットモードで起動</td><td>毎回ピュアな状態なのでおまじない枠</td></tr><tr><td>&#45;&#45;user-agent=任意のUA</td><td>ユーザーエージェントを偽装</td><td>requestsならともかくSeleniumで効果あるか疑問、UA文字列はfake-useragentが便利</td></tr><tr><td>&#45;&#45;user-data-dir=プロファイルのパス</td><td>ユーザープロファイルを指定して起動</td><td>cookieなども残せて幅が広がる(プロファイルの詳細は割愛)</td></tr><tr><td>&#45;&#45;ignore-certificate-errors</td><td>SSL証明書のエラーを無視</td><td>自己署名サイト等、使う機会は少なく不要でOK</td></tr><tr><td>&#45;&#45;disable-password-manager</td><td>パスワード保存を無効化</td><td>保存させる場面がないので不要</td></tr></tbody></table></figure>



<h3 class="wp-block-heading">表示・UI制御</h3>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#45;&#45;hide-scrollbars</td><td>スクロールバーを非表示</td><td>スクショを残すときくらい、お好みで</td></tr><tr><td>&#45;&#45;app=URL</td><td>指定したURLをアプリモードで起動</td><td>手動操作しないので使う機会はなさそう</td></tr><tr><td>&#45;&#45;disable-images</td><td>画像の読み込みを無効化</td><td>古い指定、headlessだと効かないことがある</td></tr><tr><td>&#45;&#45;blink-settings=imagesEnabled=false</td><td>画像の読み込みを無効化(より確実)</td><td>headlessでも効く、画像を止めて高速化したいなら今はこちら</td></tr><tr><td>&#45;&#45;disable-javascript</td><td>JavaScriptを無効化</td><td>JS無効で動くサイトは少ない、JS不要ならrequestsが軽い、今は後述のprefs推奨</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">このほか、どうしても読み込みたいローカル拡張があれば<strong>&#45;&#45;load-extension=拡張のパス</strong>もありますが、拡張を使うなら個人的には&#45;&#45;user-data-dir派です</p>



<h3 class="wp-block-heading">実験的・高度な制御(add_experimental_option)</h3>



<p class="wp-block-paragraph">ここからはoptions.add_argumentではなく<strong>options.add_experimental_option(name: str, value)</strong>で設定する実験的オプションです、記述の形が変わる点に注意してください</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>オプション</th><th>効果</th><th>評価</th></tr></thead><tbody><tr><td>&#8220;excludeSwitches&#8221;, [&#8220;enable-automation&#8221;]</td><td>「Chromeは自動テストソフトウェアによって制御されています」のメッセージを非表示</td><td>Bot検知回避の一つ、設定し得</td></tr><tr><td>&#8220;useAutomationExtension&#8221;, False</td><td>navigator.webdriverをundefinedに近づける(Bot検知回避)</td><td>★現在は非推奨、Chromeが使わなくなったので<strong>excludeSwitchesだけでOK</strong></td></tr><tr><td>&#8220;mobileEmulation&#8221;, {&#8220;deviceName&#8221;: deviceName}</td><td>スマホとしてブラウザを起動</td><td>deviceNameに&#8221;iPhone 14 Pro Max&#8221;や&#8221;Pixel 7&#8243;など、DevToolsのデバイス一覧が参考</td></tr><tr><td>&#8220;prefs&#8221;, {dict}</td><td>環境設定(preferences)をまとめて指定</td><td>オプションと同じ内容ならこちらが推奨</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">excludeSwitchesを設定すると、↓のメッセージが消えます</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2025/08/image-18.png"><img decoding="async" width="1024" height="538" src="https://javeo.jp/wp-content/uploads/2025/08/image-18-1024x538.png" alt="excludeSwitchesで「自動テストソフトウェアによって制御されています」の表示を消した例" class="wp-image-3419" srcset="https://javeo.jp/wp-content/uploads/2025/08/image-18-1024x538.png 1024w, https://javeo.jp/wp-content/uploads/2025/08/image-18-300x158.png 300w, https://javeo.jp/wp-content/uploads/2025/08/image-18-150x79.png 150w, https://javeo.jp/wp-content/uploads/2025/08/image-18-768x403.png 768w, https://javeo.jp/wp-content/uploads/2025/08/image-18.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<h4 class="wp-block-heading">prefs(preferences)で指定できる主なもの</h4>



<p class="wp-block-paragraph">prefsの中身も多いので、よく使うものを表にまとめました、値は例なので環境に合わせて書き換えてください</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1200px;"><thead><tr><th>キー</th><th>効果</th></tr></thead><tbody><tr><td>&#8220;download.default_directory&#8221;: &#8220;保存先のパス&#8221;</td><td>ダウンロード先を指定</td></tr><tr><td>&#8220;download.prompt_for_download&#8221;: False</td><td>ダウンロード時の確認ダイアログを無効化</td></tr><tr><td>&#8220;download.directory_upgrade&#8221;: True</td><td>既存フォルダでも強制的に保存</td></tr><tr><td>&#8220;download_bubble.partial_view_enabled&#8221;: False</td><td>ダウンロードの吹き出し通知(部分表示)を無効化</td></tr><tr><td>&#8220;savefile.default_directory&#8221;: &#8220;保存先のパス&#8221;</td><td>「名前を付けて保存」ダイアログの初期ディレクトリを指定</td></tr><tr><td>&#8220;credentials_enable_service&#8221;: False</td><td>パスワード保存のポップアップを無効化</td></tr><tr><td>&#8220;plugins.always_open_pdf_externally&#8221;: True</td><td>Chrome内蔵のPDFビューアを使わない</td></tr><tr><td>&#8220;profile.managed_default_content_settings.javascript&#8221;: 2</td><td>JavaScriptの有効(1)/無効(2)を制御</td></tr><tr><td>&#8220;profile.managed_default_content_settings.images&#8221;: 2</td><td>画像読み込みの有効(1)/無効(2)を制御</td></tr></tbody></table></figure>



<h2 class="wp-block-heading">Serviceについて</h2>



<p class="wp-block-paragraph">今のServiceは特に指定しなくてもいいレベルで、個人的に使うのは1つだけです</p>



<h3 class="wp-block-heading">creation_flags</h3>



<p class="wp-block-paragraph">creation_flagsを指定すると、<strong><span class="swl-marker mark_yellow">ChromeDriverの黒いコンソールウィンドウを非表示</span></strong>にできます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from subprocess import CREATE_NO_WINDOW

# Serviceオブジェクトを作成
service = Service()
service.creation_flags = CREATE_NO_WINDOW
service.creation_flags = 0x08000000 # CREATE_NO_WINDOWインポートしていない場合

# Serviceを渡してWebDriverを起動
driver = webdriver.Chrome(service=service)

# これ以降の処理...
driver.get(&#39;https://www.google.com&#39;)
print(driver.title)
driver.quit()</code></pre></div>



<p class="wp-block-paragraph">実行方法によりますが、VSCodeなどで実行したときは↓のメッセージが表示されなくなります</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-plain"><code>DevTools listening on ws://127.0.0.1:50152/devtools/browser/～</code></pre></div>



<p class="wp-block-paragraph">PyInstallerでアプリ化したときなんかは余計なメッセージが出なくてすっきりする気もしますが、その場合はおそらく&#45;&#45;noconsoleオプションを付けることが多いので、おまじない的な位置づけでしょうか</p>



<h3 class="wp-block-heading">余談(executable_pathが不要になった件)</h3>



<p class="wp-block-paragraph">その昔、chromedriverをChromeに合わせたバージョンに入れ替えていた時代がありまして、webdriver-managerが自動で入れ替えてくれるのでexecutable_pathと組み合わせて使っていました(当時はかなり画期的なモジュールでした)</p>



<p class="wp-block-paragraph">が、Selenium v4.6.0からはSelenium Managerが機能として実装され、<strong><span class="swl-marker mark_yellow" style="color:#e8313b">自動でWebDriverを管理してくれるので今は不要</span></strong>です、ネットには今でもこの方法を紹介しているページが残っていますが、無視して大丈夫です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># webdriver_managerを使っていた頃の起動
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# Serviceオブジェクトを作成
service = Service(executable_path=ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# これ以降の処理...
driver.get(&#39;https://www.google.com&#39;)
print(driver.title)
driver.quit()</code></pre></div>



<h2 class="wp-block-heading">結局何を使うべきか</h2>



<p class="wp-block-paragraph">プログラムによって調整は必要ですが、個人的に必須なものだけをまとめました、お好みで追加・削除してください</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service

options = Options()
options.add_argument(&#39;--start-maximized&#39;)
options.add_argument(&quot;--disable-blink-features=AutomationControlled&quot;)
options.add_experimental_option(&quot;excludeSwitches&quot;, [&quot;enable-automation&quot;])
prefs = {
    &quot;profile.managed_default_content_settings.images&quot;: 2,
    &quot;download.default_directory&quot;: os.path.dirname(__file__),
    &quot;download.prompt_for_download&quot;: False,
    &quot;download_bubble.partial_view_enabled&quot;: False,
}
options.add_experimental_option(&quot;prefs&quot;, prefs)

service = Service()
service.creation_flags = 0x08000000
driver = webdriver.Chrome(options=options, service=service)

driver.get(&#39;https://www.google.com&#39;)
print(driver.title)
driver.quit()</code></pre></div>



<h2 class="wp-block-heading">まとめ</h2>



<p class="wp-block-paragraph">オプションはかなりの量がありましたが、実のところ使うものは限られているので、上のテンプレのように<strong><span class="swl-marker mark_yellow">テンプレ化しておくのが推奨</span></strong>です</p>



<p class="wp-block-paragraph">起動まわりの設定はテンプレで固定して、要素の待ち方は<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Selenium WebDriverWaitの使い方</a>のほうにまとめているので、あわせて押さえておくと<strong><span class="swl-marker mark_yellow">スクレイピングがぐっと安定</span></strong>します</p>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/chrome-options-service/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【Python】Seleniumのfind_elementの使い方 結局CSS_SELECTOR一本でいい</title>
		<link>https://javeo.jp/selenium-find-element/</link>
					<comments>https://javeo.jp/selenium-find-element/#respond</comments>
		
		<dc:creator><![CDATA[ジャベ雄]]></dc:creator>
		<pubDate>Wed, 20 Aug 2025 14:02:51 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[Selenium]]></category>
		<category><![CDATA[スクレイピング]]></category>
		<category><![CDATA[自動化]]></category>
		<guid isPermaLink="false">https://javeo.jp/?p=3305</guid>

					<description><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/selenium-find-element-1024x538.jpg" class="webfeedsFeaturedVisual" /></p>PythonのSeleniumでfind_element / find_elementsを使う方法を、Byの選び方からエラー回避までまとめました、結局CSS_SELECTOR一本でいい理由、各Byの書き換え方、NoSuchElementExceptionに強い待機の書き方まで、例つきで解説します]]></description>
										<content:encoded><![CDATA[<p><img src="https://javeo.jp/wp-content/uploads/2026/06/selenium-find-element-1024x538.jpg" class="webfeedsFeaturedVisual" /></p><div class="codoc-evacuations" style="display:none;" data-shortcode=""></div>
<p class="wp-block-paragraph">Seleniumで一番よく使うのが、要素を探す<strong>find_element</strong>と<strong>find_elements</strong>ですよね、ブラウザを自動操作するときは、画面上のボタンや入力欄を「どうやって特定するか」がそのまま安定度に効いてきます</p>



<div class="wp-block-group is-style-big_icon_memo"><div class="wp-block-group__inner-container">
<p class="wp-block-paragraph">この記事は<strong>find_element の使い方</strong>=「Byの選び方」と「エラーの回避」が主役です、<strong><span class="swl-marker mark_yellow">CSSセレクタの書き方そのもの</span></strong>(属性・結合子・nth-childなどの一覧)は別記事「<a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方 自動化で要素を狙う指定方法</a>」にまとめたので、書き方を深掘りしたいときはそちらをどうぞ</p>
</div></div>



<h2 class="wp-block-heading">まずは要素検索の基本</h2>



<p class="wp-block-paragraph">まずはよくある基本の書き方です</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.get(&quot;https://example.com&quot;)

element = driver.find_element(By.ID, &quot;username&quot;)</code></pre></div>



<p class="wp-block-paragraph">このように<strong>By.ID</strong>や<strong>By.NAME</strong>などを使って要素を探します、1件だけなら<strong>find_element</strong>、当てはまる要素を全部リストで取りたいときは<strong>find_elements</strong>です</p>



<p class="wp-block-paragraph">でも、この<strong><span class="swl-marker mark_yellow">Byの選び方</span></strong>によって、コードの安定性や書きやすさが全然変わってきます</p>



<h2 class="wp-block-heading">Byの種類とそれぞれの特徴</h2>



<p class="wp-block-paragraph">Byの種類は実は結構な数がありまして、こんな感じです</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>By.ID</li>



<li>By.NAME</li>



<li>By.CLASS_NAME</li>



<li>By.TAG_NAME</li>



<li>By.LINK_TEXT</li>



<li>By.PARTIAL_LINK_TEXT</li>



<li>By.CSS_SELECTOR</li>



<li>By.XPATH</li>
</ul>



<p class="wp-block-paragraph">ネットでは By.ID や By.CLASS_NAME もよく見かけますが、結論は <strong><span class="swl-marker mark_yellow" style="color:#e8313b">By.CSS_SELECTOR</span></strong> を使っておけば間違いないです</p>



<p class="wp-block-paragraph">もう一つの候補が <strong>By.XPATH</strong> ですが、CSS_SELECTORはスクレイピングで使う<strong>Beautiful Soup</strong>にも応用できますし、記述がすっきりしてわかりやすいので、こちらに軍配が上がります</p>



<h2 class="wp-block-heading">結局CSS_SELECTOR一本でいい理由</h2>



<p class="wp-block-paragraph">CSS_SELECTORが最適な一番の理由は、<strong><span class="swl-marker mark_yellow">他のByを全部CSS_SELECTORで代用できる</span></strong>ところにあります</p>



<p class="wp-block-paragraph">つまり、CSS_SELECTORさえ覚えてしまえば、他を使う必要がなくなるんです</p>



<p class="wp-block-paragraph">ここからは、各Byを CSS_SELECTOR に書き換えるとどうなるかの一覧です、<strong>find_element(By.◯◯, &#8216;値&#8217;)</strong> の◯◯と値が、CSS_SELECTORならこう書けます(XPATHも参考に並べました)</p>


<div class="c-scrollHint sp_"><span>スクロールできます <i class="icon-more_arrow"></i></span></div>
<figure data-table-scrollable="sp" class="wp-block-table is-style-stripes"><table style="--table-width:1000px;"><thead><tr><th>探したいもの</th><th>普通のBy指定</th><th>CSS_SELECTOR一本だと</th><th>XPATH(参考)</th></tr></thead><tbody><tr><td>id</td><td>By.ID, &#8216;hoge&#8217;</td><td>&#8216;#hoge&#8217;</td><td>&#8216;//*[@id=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>class</td><td>By.CLASS_NAME, &#8216;hoge&#8217;</td><td>&#8216;.hoge&#8217;</td><td>&#8216;//*[@class=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>タグ</td><td>By.TAG_NAME, &#8216;div&#8217;</td><td>&#8216;div&#8217;</td><td>&#8216;//div&#8217;</td></tr><tr><td>name属性</td><td>By.NAME, &#8216;hoge&#8217;</td><td>&#8216;[name=&#8221;hoge&#8221;]&#8217;</td><td>&#8216;//*[@name=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>その他の属性</td><td>専用のByなし</td><td>&#8216;[data-test=&#8221;hoge&#8221;]&#8217;</td><td>&#8216;//*[@data-test=&#8221;hoge&#8221;]&#8217;</td></tr><tr><td>複数クラス</td><td>専用のByなし</td><td>&#8216;div.hoge.piyo&#8217;</td><td>&#8216;//div[contains(@class,&#8221;hoge&#8221;) and contains(@class,&#8221;piyo&#8221;)]&#8217;</td></tr></tbody></table></figure>



<p class="wp-block-paragraph">ひとつ例外があって、リンクを<strong>文字(テキスト)</strong>で探す By.LINK_TEXT / By.PARTIAL_LINK_TEXT だけは、CSS_SELECTORに「文字で探す」書き方がありません、その場合は <strong>aタグを集めて for でテキスト一致</strong>させると同じことができます</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># テキストが完全一致するリンク(By.LINK_TEXT 相当)
next((a for a in driver.find_elements(By.CSS_SELECTOR, &#39;a&#39;) if a.text == &#39;hoge&#39;), None)

# テキストが部分一致するリンク(By.PARTIAL_LINK_TEXT 相当)
next((a for a in driver.find_elements(By.CSS_SELECTOR, &#39;a&#39;) if &#39;hoge&#39; in a.text), None)</code></pre></div>



<h3 class="wp-block-heading">親子・兄弟もCSS_SELECTORでたどれる</h3>



<p class="wp-block-paragraph">CSS_SELECTORのもう一つの大きな強みが、<strong><span class="swl-marker mark_yellow">親子要素・兄弟要素をたどって一意に指定できる</span></strong>ところです</p>



<p class="wp-block-paragraph">親子・兄弟というのは、HTMLソースで見たときの縦・横の関係です</p>



<ul class="wp-block-list is-style-check_list">
<li>親子　…　階層の深さ(入れ子の関係)</li>



<li>兄弟　…　同じ階層での横並び</li>
</ul>



<figure class="wp-block-image size-full is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2025/08/image-16.png"><img decoding="async" width="707" height="544" src="https://javeo.jp/wp-content/uploads/2025/08/image-16.png" alt="親要素・子要素・兄弟要素の階層を示したHTML構造の図" class="wp-image-3316" title="" srcset="https://javeo.jp/wp-content/uploads/2025/08/image-16.png 707w, https://javeo.jp/wp-content/uploads/2025/08/image-16-300x231.png 300w, https://javeo.jp/wp-content/uploads/2025/08/image-16-150x115.png 150w" sizes="(max-width: 707px) 100vw, 707px" /></a></figure>



<p class="wp-block-paragraph">例えば上の図で黄色く囲った<strong>説明文2です</strong>の要素を取りたいとき、クラス名だけで指定すると</p>



<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>driver.find_element(By.CLASS_NAME, &quot;description&quot;)</code></pre></div>



<p class="wp-block-paragraph">上にある「説明文です」の方を先に拾ってしまいます(n番目で指定する手もありますが、ややこしくなるので割愛します)</p>



<p class="wp-block-paragraph">うまく取るには、指定が一意になるよう<strong>親要素から</strong>たどります、どこまで丁寧に書くかですが</p>



<ul class="wp-block-list is-style-check_list">
<li>&#8216;.younger .description&#8217;</li>



<li>&#8216;.younger &gt; .card &gt; .description&#8217;</li>



<li>&#8216;div.younger &gt; div.card &gt; p.description&#8217;</li>
</ul>



<p class="wp-block-paragraph">などで取れます</p>



<p class="wp-block-paragraph">ここで使った スペース(子孫)や <strong>&gt;</strong>(直下の子)といった<strong>結合子</strong>は、隣接(<strong>+</strong>)や兄弟(<strong>~</strong>)も含めて種類があります、結合子の一覧と使い分けは別記事「<a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方</a>」の結合子の節にまとめたので、引き出しを増やしたいときはどうぞ</p>



<p class="wp-block-paragraph">※このページの下部に同じ画像とサンプルHTMLを置いてあるので、実際に試してみてください</p>



<h3 class="wp-block-heading">開発者ツールでセレクタを下書きする</h3>



<p class="wp-block-paragraph">慣れればソースを見て起点の要素と狙った要素までの道のりが判断できるようになりますが、最初のうちは<strong>開発者ツール(DevTools)</strong>に下書きさせると早いです</p>



<figure class="wp-block-image size-large is-style-shadow"><a href="https://javeo.jp/wp-content/uploads/2025/08/image-17.png"><img decoding="async" width="1024" height="645" src="https://javeo.jp/wp-content/uploads/2025/08/image-17-1024x645.png" alt="開発者ツールでCSSセレクタをコピーする画面" class="wp-image-3320" srcset="https://javeo.jp/wp-content/uploads/2025/08/image-17-1024x645.png 1024w, https://javeo.jp/wp-content/uploads/2025/08/image-17-300x189.png 300w, https://javeo.jp/wp-content/uploads/2025/08/image-17-150x94.png 150w, https://javeo.jp/wp-content/uploads/2025/08/image-17-768x483.png 768w, https://javeo.jp/wp-content/uploads/2025/08/image-17.png 1185w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></figure>



<p class="wp-block-paragraph">右クリックの<strong>Copy → Copy selector</strong>でセレクタを取得できます、ただそのまま使うには長くて<strong><span class="swl-marker mark_yellow">壊れやすい</span></strong>ことも多いので、下書きとして受け取って自分で短く整えるのがおすすめです</p>



<h2 class="wp-block-heading">find_elementでよくあるエラーと回避方法</h2>



<p class="wp-block-paragraph">Seleniumを触っているとよく出会うのが <strong>NoSuchElementException</strong> や <strong>ElementNotInteractableException</strong> です</p>



<p class="wp-block-paragraph">要素が見つからなかったり、まだ読み込みが終わっていないのが原因です</p>



<p class="wp-block-paragraph">例えば画面の文字を取得するとき、素直に書くとこうなりますが</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>一般的な文字の取得方法</span></div><div class="cap_box_content">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code>hoge = driver.find_element(By.CSS_SELECTOR, &#39;#hoge&#39;).text</code></pre></div>
</div></div>



<p class="wp-block-paragraph">ただ、これだと指定した要素が見つからなかったときに<strong><span class="swl-marker mark_yellow">エラーで止まってしまいます</span></strong></p>



<p class="wp-block-paragraph">それを防ぐには、次の2パターンのどちらかがおすすめです</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>WebDriverWaitで要素の出現を待つ</span></div><div class="cap_box_content">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 10秒待っても要素が見つからないエラーをキャッチする
try:
    elm = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, &#39;#hoge&#39;)))
    hoge = elm.text
except TimeoutException:
    print(&#39;#hoge が見つかりませんでした&#39;)
except Exception:
    print(&#39;予期せぬエラーが発生しました&#39;)</code></pre></div>
</div></div>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>ジェネレータ式で最初の要素を取得する</span></div><div class="cap_box_content">
<div class="hcb_wrap"><pre class="prism line-numbers lang-python" data-lang="Python"><code># 要素が見つからないとNoneを返す
elm = next((e for e in driver.find_elements(By.CSS_SELECTOR, &#39;#hoge&#39;)), None)
if elm:
    hoge = elm.text
else:
    print(&#39;#hoge が見つかりませんでした&#39;)</code></pre></div>
</div></div>



<p class="wp-block-paragraph">やり方は違いますが、どちらも「<strong><span class="swl-marker mark_yellow">まず要素を検索</span></strong>」してから「目的のアクションを実行」することでエラーを防いでいます</p>



<p class="wp-block-paragraph">このやり方なら、文字の取得だけでなく、文字入力やクリックにもそのまま流用できます</p>



<p class="wp-block-paragraph">1つ目の <strong>WebDriverWait</strong> は奥が深くて、何を待つか(<strong>expected_conditions</strong>)の選び方で安定感が変わります、待ちでつまづいたら別記事「<a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Seleniumで要素を確実に待つ方法</a>」に詳しくまとめたので、あわせてどうぞ</p>



<h2 class="wp-block-heading">あとがき</h2>



<p class="wp-block-paragraph">基礎の基礎に見える find_element でも、Byの選び方やエラー回避まで含めると結構奥が深いです</p>



<p class="wp-block-paragraph">少しずつ理解を深めて、Seleniumを活用していきたいですね</p>



<p class="wp-block-paragraph">あわせて読みたい記事も置いておきます</p>



<ul class="wp-block-list is-style-check_list -list-under-dashed">
<li>セレクタの書き方を深掘りしたい … <a href="https://javeo.jp/css-selector/" target="_blank" rel="noopener noreferrer">CSSセレクタの書き方</a></li>



<li>要素の待ち方で困っている … <a href="https://javeo.jp/python_wait/" target="_blank" rel="noopener noreferrer">Seleniumで要素を確実に待つ方法</a></li>



<li>ExcelのVBAで同じことをやりたい … <a href="https://javeo.jp/selenium-vba-code/" target="_blank" rel="noopener noreferrer">SeleniumVBA実践コード集</a></li>
</ul>



<p class="wp-block-paragraph">最後に、練習に使えるHTMLを置いておきますので、ご自由にどうぞ</p>



<h2 class="wp-block-heading">サンプルHTML</h2>



<p class="wp-block-paragraph">下のサンプルはこのページに実際に表示されています、開発者ツールで構造を見ながら、上で紹介したセレクタを試してみてください</p>



<div class="swell-block-capbox cap_box"><div class="cap_box_ttl"><span>練習用サンプル</span></div><div class="cap_box_content">
<section class="sample">

    <div class="parent">

        <p>親要素です</p>

        <div class="child older">

            <p>子要素です</p>

            <div class="grandchild">

                <p>孫要素です</p>

                <div class="card">

                    <p class="description">説明文です</p>

                    <a href="#" class="cta">詳しく見る</a>

                </div>

            </div>

        </div>

        <div class="child younger">

            <p>子要素の兄弟要素です</p>

            <div class="card">

                <p class="description">説明文2です</p>

                <a href="#" class="cta">詳しく見る</a>

            </div>

        </div>

    </div>

</section>
</div></div>


<div class="p-blogParts post_content" data-partsID="4602">
<div class="jv-books" data-shelf="python"><div class="jv-books-head"><span class="jv-books-title"><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4da.png" alt="📚" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Python自動化の独学に効く本</span><span class="jv-books-pr">PR</span></div><div class="jv-books-grid"><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240" alt="退屈なことはPythonにやらせよう 第3版" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">退屈なことはPythonにやらせよう 第3版</p><p class="jv-book-author">Al Sweigart</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4814401523">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4814401523">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240" alt="シゴトがはかどる Python自動処理の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">シゴトがはかどる Python自動処理の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839973857">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839973857">楽天で見る</a></div></div></div><div class="jv-book-card"><a class="jv-book-cover" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer"><img decoding="async" src="https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240" alt="もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書" width="120" height="170" loading="lazy"></a><div class="jv-book-info"><p class="jv-book-title">もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書</p><p class="jv-book-author">クジラ飛行机</p><div class="jv-book-btns"><a class="jv-btn jv-btn-az" href="https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="amazon" data-book="4839988307">Amazonで見る</a><a class="jv-btn jv-btn-rk" href="https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F" target="_blank" rel="nofollow sponsored noopener noreferrer" data-shelf="python" data-mall="rakuten" data-book="4839988307">楽天で見る</a></div></div></div></div><p class="jv-books-note">私のおすすめからランダムで3冊を表示しています</p></div>
<style>
.jv-books{border:1px solid #e0e0e0;border-radius:8px;padding:16px;margin:1.5em 0;background:#fff}
.jv-books-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:12px}
.jv-books-title{font-weight:700;font-size:1.05em}
.jv-books-pr{font-size:.7em;color:#888;border:1px solid #ccc;border-radius:3px;padding:1px 6px;flex-shrink:0}
.jv-books-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;min-height:330px}
.jv-book-card{display:flex;flex-direction:column;align-items:center;text-align:center;border:1px solid #f0f0f0;border-radius:6px;padding:12px 8px;background:#fafafa}
.jv-book-cover img{width:auto;max-width:120px;height:170px;object-fit:contain}
.jv-book-info{width:100%;flex:1;display:flex;flex-direction:column}
.jv-book-title{font-size:.82em;font-weight:600;line-height:1.4;margin:8px 0 2px;min-height:2.8em;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.jv-book-author{font-size:.72em;color:#777;margin:0 0 8px}
.jv-book-btns{display:flex;flex-direction:column;gap:6px;width:100%;margin-top:auto}
.jv-btn{display:block;text-align:center;font-size:.78em;font-weight:600;color:#fff!important;text-decoration:none!important;border-radius:4px;padding:7px 4px;line-height:1.2}
.jv-btn-az{background:#e88b00}
.jv-btn-rk{background:#bf0000}
.jv-btn:hover{opacity:.85}
.jv-books-note{font-size:.7em;color:#999;text-align:right;margin:8px 0 0}
@media(max-width:599px){
.jv-books-grid{grid-template-columns:1fr;min-height:0}
.jv-book-card{flex-direction:row;text-align:left;gap:12px}
.jv-book-cover img{height:110px;max-width:80px}
.jv-book-info{min-width:0}
.jv-book-title{min-height:0}
.jv-book-btns{flex-direction:row}
.jv-btn{flex:1}
}
</style>
<script>
(function(){
var SHELF='python';
var all=document.querySelectorAll('.jv-books[data-shelf="'+SHELF+'"]');
var root=null;
for(var k=0;k<all.length;k++){if(!all[k].dataset.jvinit){root=all[k];break;}}
if(!root)return;
root.dataset.jvinit='1';
var POOL=[{"t": "退屈なことはPythonにやらせよう 第3版", "a": "Al Sweigart", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1529/9784814401529_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4814401523?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18513569%2F", "id": "4814401523"}, {"t": "シゴトがはかどる Python自動処理の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/3858/9784839973858.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839973857?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F16520665%2F", "id": "4839973857"}, {"t": "もっとシゴトがはかどる Python×Excel×AI 業務自動化の教科書", "a": "クジラ飛行机", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/8302/9784839988302_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4839988307?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F18238595%2F", "id": "4839988307"}, {"t": "Python2年生 スクレイピングのしくみ 第2版", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/2605/9784798182605.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4798182605?tag=javeo2022-22", "rk": "https://hb.afl.rakuten.co.jp/hgc/24ecde15.e492bb61.24ecde16.6c9a125b/?pc=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F&#038;m=https%3A%2F%2Fbooks.rakuten.co.jp%2Frb%2F17821975%2F", "id": "4798182605"}, {"t": "今日からできる！ Python業務効率化スキルが身につく本", "a": "いまにゅ", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/7259/9784046057259_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4046057254?tag=javeo2022-22", "rk": "", "id": "4046057254"}, {"t": "Python自動化簡単レシピ Excel・Word・PDFなどの面倒なデータ処理をサクッと解決", "a": "森巧尚", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/6124/9784798166124_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/479816612X?tag=javeo2022-22", "rk": "", "id": "479816612X"}, {"t": "生成AIと一緒に学ぶ Pythonふりがなプログラミング", "a": "リブロワークス", "img": "https://thumbnail.image.rakuten.co.jp/@0_mall/book/cabinet/1414/9784295021414_1_2.jpg?_ex=240x240", "az": "https://www.amazon.co.jp/dp/4295021415?tag=javeo2022-22", "rk": "", "id": "4295021415"}];
var REL='nofollow sponsored noopener noreferrer';
function el(tag,cls){var e=document.createElement(tag);if(cls)e.className=cls;return e;}
function btn(href,cls,label,mall,id){
var a=el('a','jv-btn '+cls);a.href=href;a.target='_blank';a.rel=REL;a.textContent=label;
a.setAttribute('data-shelf',SHELF);a.setAttribute('data-mall',mall);a.setAttribute('data-book',id);
return a;}
function card(b){
var d=el('div','jv-book-card');
var cover=el('a','jv-book-cover');cover.href=b.az;cover.target='_blank';cover.rel=REL;
var img=el('img');img.src=b.img;img.alt=b.t;img.width=120;img.height=170;img.loading='lazy';
cover.appendChild(img);
var info=el('div','jv-book-info');
var ttl=el('p','jv-book-title');ttl.textContent=b.t;
var au=el('p','jv-book-author');au.textContent=b.a;
var btns=el('div','jv-book-btns');
btns.appendChild(btn(b.az,'jv-btn-az','Amazonで見る','amazon',b.id));
if(b.rk){btns.appendChild(btn(b.rk,'jv-btn-rk','楽天で見る','rakuten',b.id));}
info.appendChild(ttl);info.appendChild(au);info.appendChild(btns);
d.appendChild(cover);d.appendChild(info);
return d;}
var pool=POOL.slice();
for(var i=pool.length-1;i>0;i--){var j=Math.floor(Math.random()*(i+1));var t=pool[i];pool[i]=pool[j];pool[j]=t;}
var grid=root.querySelector('.jv-books-grid');
grid.style.opacity='0';
while(grid.firstChild)grid.removeChild(grid.firstChild);
pool.slice(0,3).forEach(function(b){grid.appendChild(card(b));});
grid.style.transition='opacity .5s ease';
void grid.offsetWidth;
grid.style.opacity='1';
})();
</script>
</div>]]></content:encoded>
					
					<wfw:commentRss>https://javeo.jp/selenium-find-element/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
