Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

5 Commits

Repository files navigation

Pythonの構文エラーを回避して修正する方法

Promo

このガイドでは、よくあるPythonの構文エラー、事前に防ぐために使用すべきプロアクティブな戦略、そして効率的に解決するために使用すべきリアクティブな方法について解説します。

Pythonにおける構文エラー

Python Interpreter はPythonコードを実行し、機械語に翻訳します。構文ルールに違反すると実行が停止し、トレースバック付きのエラーメッセージが表示されます。

構文エラーは、言語における文法ミスに似た、構造上の誤りから発生します。たとえばPythonでは、if 文やループなどのブロックに対して正しいインデントが必要です。

プログラム実行中に発生するランタイムエラーとは異なり、構文エラーは実行そのものを完全に妨げます。

Types of Syntax Errors

Pythonには多くの構文ルールがあるため、構文エラーはよく発生します。このセクションでは、頻出するいくつかのエラーとその解決方法を取り上げます。

Misplaced, Missing, or Mismatched Punctuation

Pythonはコード構造化のために句読点(記号)に依存しています。構文エラーを避けるために、正しい位置に配置され、適切に対応していることを確認してください。

たとえば、丸括弧 (), 角括弧 [], 波括弧 {} は常にペアで使用しなければなりません。開いた場合は必ず閉じる必要があります。

以下の例では、波括弧が閉じられていません。

# Incorrectproxies= {
'http': proxy_url,
'https': proxy_url

これを実行しようとすると、インタープリタは SyntaxError を投げます。

File"python-syntax-errors.py", line2proxies= {
^SyntaxError: '{'wasneverclosed

Pythonインタープリタは、ファイル名、行番号、そしてエラーが発生した箇所を示す矢印を含む詳細なエラーメッセージを提供します。ここでは、'{' was never closed{ が閉じられていない)と指定しています。

この情報があれば、波括弧を閉じることで問題を簡単に特定して修正できます。

# Correctproxies= {
'http': proxy_url,
'https': proxy_url
} # Closed a curly bracket

クォート(' または ")もPythonではよく問題になります。多くのプログラミング言語と同様に、Pythonではクォートを使って文字列を定義します。文字列を開くクォートと閉じるクォートは、必ず同じ種類を使用してください。

# Incorrecthost= "brd.superproxy.io'

シングルクォートとダブルクォートを混在させると、構文エラーになります。

File"python-syntax-errors.py", line2host= "brd.superproxy.io'
^SyntaxError: unterminatedstringliteral (detectedatline2)

ここでは、インタープリタが2行目で文字列リテラルが終端されていないことを示しています。

# Correcthost="brd.superproxy.io"

文字列にシングルクォートとダブルクォートの両方が含まれる場合は、トリプルクォート(''' または """)で文字列を囲みます。次のようにします。

quote="""He said, "It's the best proxy service you can find!", and showed me this provider."""

カンマは、リスト、タプル、関数引数の項目を区切ります。カンマが欠けていると、予期しないエラーにつながることがあります。

# Incorrectproxies= [
{"http": "http://123.456.789.1:8080", "https": "https://123.456.789.1:8080"}
{"http": "http://98.765.432.1:3128", "https": "https://98.765.432.1:3128"}
{"http": "http://192.168.1.1:8080", "https": "https://192.168.1.1:8080"}
]

このコードを実行すると、次のエラーメッセージになります。

File"python-syntax-errors.py", line3
{"http": "http://123.456.789.1:8080", "https": "https://123.456.789.1:8080"}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^SyntaxError: invalidsyntax. Perhapsyouforgotacomma?

エラーメッセージは有用ですが、すべての問題を検出できるとは限りません。カンマの欠落が検出された場合は、周辺のコードに他のカンマ漏れがないかも確認し、正しい構文になっていることを確かめてください。

# Correctproxies= [
{"http": "http://123.456.789.1:8080", "https": "https://123.456.789.1:8080"},
{"http": "http://98.765.432.1:3128", "https": "https://98.765.432.1:3128"},
{"http": "http://192.168.1.1:8080", "https": "https://192.168.1.1:8080"}
]

カンマとは対照的に、コロンは新しいコードブロック(if 文や for ループなど)を開始するために使用されます。

importrequestsfrombs4importBeautifulSoup# Incorrectresponse=requests.get('https://example.com')
ifresponse.status_code==200soup=BeautifulSoup(response.content, 'html.parser')
title=soup.title.textprint(title)
)

コロンを忘れると、次の構文エラーになります。

ifresponse.status_code==200^SyntaxError: expected':'

このエラーメッセージからコロンが欠けていることは明確なので、提案されている場所にコロンを追加して修正できます。

importrequestsfrombs4importBeautifulSoup# Correctresponse=requests.get('https://example.com')
ifresponse.status_code==200:
soup=BeautifulSoup(response.content, 'html.parser')
title=soup.title.textprint(title)

Misspelled, Misplaced, or Missing Python Keywords

Python keywords は特定の意味を持つ予約語であり、変数名として使用できません。キーワードのスペルミス、位置の誤り、または省略はエラーの原因になります。

たとえば、requestspprint モジュールをインポートする際に import キーワードを誤ってスペルミスすると問題が起きます。

# Incorrectimprotrequestsimportpprint

このスペルミスにより、インタープリタは次の invalid syntax エラーを発生させます。

File"python-syntax-errors.py", line2improtrequests^^^^^^^^SyntaxError: invalidsyntax

エラーメッセージによっては曖昧な場合があり、追加の注意が必要です。このケースでは矢印が requests を指しており、構文エラーが検出された場所を示しています。モジュール名のスペルミスは構文エラーを引き起こさないため、問題は import キーワードのスペルミスである可能性が高いです。

import を修正するとエラーは解消します。

# Correctimportrequestsimportpprint

また、from ... import … 文を次のように間違えることもあります。

importBeautifulSoupfrombs4

一見問題なさそうに見えますが、from キーワードは import の前に来る必要があるため、上記コードを実行するとエラーになります。

File"python-syntax-errors.py", line2importBeautifulSoupfrombs4^^^^SyntaxError: invalidsyntax

fromimport を入れ替えると解決します。

frombs4importBeautifulSoup

キーワードの省略は、Pythonでさまざまなエラーを引き起こす可能性があります。この問題は微妙で、欠けているキーワードによって異なるエラーが表示される場合があります。

たとえば、値を返すはずの関数で return キーワードを省略すると、予期しない挙動になることがあります。

deffetch_data():
response=requests.get('https://example.com')
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
# Missing a return statement heredata=fetch_data()

これは構文エラーにはなりませんが、関数は期待される結果ではなく None を返します。return キーワードを追加すると、上記コードは修正できます。

deffetch_data():
response=requests.get('https://example.com')
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
returndatadata=fetch_data()

関数を定義する際に def キーワードを忘れると、構文エラーになります。

# Missing the `def` keywordfetch_data():
response=requests.get('https://example.com')
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
returndatadata=fetch_data()

上記コードでは、関数名の前にキーワードが必要だとインタープリタが期待するため、構文エラーが発生します。

File"python-syntax-errors.py", line1fetch_data():
^SyntaxError: invalidsyntax

def キーワードを追加すると解決します。

deffetch_data():
response=requests.get('https://example.com')
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
returndatadata=fetch_data()

条件文で if キーワードを忘れると、インタープリタが条件の前にキーワードを期待するためエラーになります。

importrequestsfrombs4importBeautifulSoupresponse=requests.get('https://example.com')
# Missing the if keywordresponse.status_code==200:
soup=BeautifulSoup(response.content, 'html.parser')
title=soup.title.textprint(title)
File"python-syntax-errors.py", line6response.status_code==200:
^SyntaxError: invalidsyntax

この問題は、if キーワードを含めるだけで修正できます。

importrequestsfrombs4importBeautifulSoupresponse=requests.get('https://example.com')
ifresponse.status_code==200:
soup=BeautifulSoup(response.content, 'html.parser')
title=soup.title.textprint(title)

Note: キーワードの欠落は他の種類のエラーも引き起こす可能性があるため、特に注意してください。

Incorrect Use of the Assignment Operator

Pythonでは、=代入に、==比較に使用します。これらを混同すると構文エラーになることがあります。

importrequestsfrombs4importBeautifulSoup# Incorrectresponse=requests.get('https://example.com', proxies=proxies)
ifresponse=requests.get('https://example.com/data', proxies=proxies):
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
foritemindata:
print(item.text)
else:
print("Failed to retrieve data")

前のコードでは、インタープリタが問題の原因を正しく検出しています。

File"python-syntax-errors.py", line5ifresponse=requests.get('https://example.com/data', proxies=proxies)
^^^^^^

ここでは、responserequest.get() の結果と一致するかをチェックしようとしています。エラーを修正するには、if 文の代入演算子(=)を比較演算子(==)に置き換えてください。

importrequestsfrombs4importBeautifulSoup# Correctresponse=requests.get('https://example.com', proxies=proxies)
# Change in the following lineifresponse==requests.get('https://example.com/data', proxies=proxies):
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
foritemindata:
print(item.text)
else:
print("Failed to retrieve data")

Indentation Errors

Pythonはインデントによりコードブロックを定義します。不正なインデントはインタープリタがブロック構造を認識できなくなり、IndentationError につながります。

# Incorrectasyncwithasync_playwright() asplaywright:
awaitrun(playwright)

上記の例では、コロンの後のブロック定義にインデントがありません。コードを実行するとエラーになります。

File"python-syntax-errors.py", line2awaitrun(playwright)
^IndentationError: expectedanindentedblockafterthewithstatementonline1

この問題を修正するには、Pythonの構文ルールに従い、コードブロックを正しくインデントしてください。

# Correctasyncwithasync_playwright() asplaywright:
awaitrun(playwright)

Issues with Variable Declarations

変数名は英字またはアンダースコアで始める必要があり、使用できる文字は英字、数字、アンダースコアのみです。Pythonは大文字と小文字を区別するため、myvariablemyVariableMYVARIABLE は別物です。

変数名は数字で始められません。以下の例は 1 から始めているため、このルールに違反しています。

# Incorrect1st_port=22225

上記コードを実行すると、インタープリタは SyntaxError を発生させます。

File"python-syntax-errors.py", line21st_port=1^SyntaxError: invaliddecimalliteral

修正するには、変数名を英字またはアンダースコアで開始する必要があります。以下のいずれかで対応できます。

# Correctfirst_port=22225port_no_1=22225

Function Definition and Call Errors

関数を定義するには、def キーワード、関数名、丸括弧、コロンを使用します。関数を呼び出すときは、関数名の後に丸括弧を付けます。これらの要素のいずれかを省略すると、構文エラーになります。

importrequestsfrombs4importBeautifulSoup# Incorrectdeffetch_dataresponse=requests.get('https://example.com')
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
returndata# Incorrectdata=fetch_data

この例では、要素の欠落により複数の構文エラーが発生しています。修正するには、関数定義の fetch_data の後に丸括弧とコロンを追加し、最終行の関数呼び出しにも丸括弧を追加してください。

importrequestsfrombs4importBeautifulSoup# Correcteddeffetch_data():
response=requests.get('https://example.com')
soup=BeautifulSoup(response.content, 'html.parser')
data=soup.find_all('div', class_='data')
returndata# Correcteddata=fetch_data()

関数定義で丸括弧やコロンが欠けると、常に構文エラーになります。一方で、関数呼び出し(fetch_data())で丸括弧を忘れても例外が発生しない場合があり、予期しない挙動につながる可能性があります。

Avoiding Syntax Errors

エラーのないコードを書くことは、練習とともに身に付くスキルです。以下のベストプラクティスを理解して実装することで、よくある構文エラーを回避できます。

Proactive Strategies

構文エラーへの最善の対処方法は、事前に防ぐことです。プロジェクトを始める前に、その言語で最も一般的な構文ルールを把握しておいてください。

Use a Code Editor with Syntax Highlighting and Indentation Checking

優れたコードエディタは、シンタックスハイライトやインデントチェックなどの機能により構文エラーの回避に役立ちます。これらのツールは、コードを実行する前に問題を発見できます。

たとえば、エディタ上の赤いマークは、if response.status_code == 200 にコロンが欠けていることを示している可能性があります。

A red mark suggesting there is an error

Follow Consistent Coding Style Guidelines

一貫性は、クリーンでエラーのないコードを書くための鍵です。一貫したスタイルに従うことで可読性が向上し、エラーを見つけやすくなります。

Pythonでは、PEP 8 Style Guide が標準であり、変数命名、インデント、空白の使い方などに関するガイドラインを提供しています。

Write Code in Small, Well-Defined Functions

コードを小さく明確に定義された関数に分割すると、管理性とデバッグ性が向上します。各関数は単一で明確な目的を持つべきです。多くの処理を詰め込みすぎた関数は理解やデバッグが難しくなります。

たとえば、scrape_and_analyze() 関数を考えてみてください。

importrequestsfrombs4importBeautifulSoupfromtextblobimportTextBlobdefscrape_and_analyze():
url="https://example.com/articles"response=requests.get(url)
soup=BeautifulSoup(response.content, "html.parser")
titles=soup.find_all("h2", class_="article-title")
sentiments= []
fortitleintitles:
title_text=title.get_text()
blob=TextBlob(title_text)
sentiment=blob.sentiment.polaritysentiments.append(sentiment)
returnsentimentsprint(scrape_and_analyze())

この例では、より読みやすくするために、この関数を複数の小さな関数に分割し、それぞれがより小さく管理しやすいコード部分を実行するようにしたほうがよいです。

importrequestsfrombs4importBeautifulSoupfromtextblobimportTextBlobdefscrape_titles(url):
"""Scrape article titles from a given URL."""response=requests.get(url)
soup=BeautifulSoup(response.content, "html.parser")
titles=soup.find_all("h2", class_="article-title")
return [title.get_text() fortitleintitles]
defanalyze_sentiment(text):
"""Analyze sentiment of a given text."""blob=TextBlob(text)
returnblob.sentiment.polaritydefanalyze_titles_sentiment(titles):
"""Analyze sentiment of a list of titles."""return [analyze_sentiment(title) fortitleintitles]
defscrape_and_analyze(url):
"""Scrape titles from a website and analyze their sentiment."""titles=scrape_titles(url)
sentiments=analyze_titles_sentiment(titles)
returnsentimentsurl="https://example.com/articles"print(scrape_and_analyze(url))

Reactive Strategies

最善を尽くしても、エラーは発生することがあります。Pythonは問題の内容と場所を示すエラーメッセージを提供します。

Read Error Messages Carefully

Pythonのエラーメッセージは、問題の内容と場所に関する詳細を提供します。注意深く分析することで、問題を特定して解決策を見つけやすくなります。

Use Print Statements Strategically

print() 文を使うと、実行フローを追跡したり、小規模プロジェクトで変数値を確認したりできます。素早いデバッグには有用ですが、セキュリティおよびパフォーマンス上のリスクがあるため、本番環境では使用すべきではありません。

複雑な問題や大規模なコードベースでは、デバッガのほうが効果的です。デバッガを使うと、ブレークポイントの設定、ステップ実行、複数の関数呼び出しにまたがる変数の検査が可能になり、より制御されたデバッグプロセスを実現できます。

Leverage Online Resources and Communities

難しいエラーで行き詰まった場合は、遠慮なく助けを求めてください。Python DocsReal Python などのオンラインリソースは有用なガイダンスを提供しています。r/Pythonr/LearnPythonStack OverflowPython Forum といったコミュニティは、回答や解決策を見つけるのに最適な場所です。

Conclusion

信頼性の高いプロキシサービス、自動化されたデータ収集、すぐに使えるデータセット、またはWebスクレイピングタスクの自動化が必要な場合でも、Bright DataはWebスクレイピングプロジェクトをより効率的かつ生産的にするためのソリューションを提供しています。PythonでWebスクレイピングを学びたいですか?詳細なステップバイステップのPythonスクレイピングガイドをお読みください。

今すぐサインアップして、ニーズに合った適切なプロダクトを見つけ、無料トライアルを本日開始してください!

About

一般的なPythonの構文エラーを特定し、回避し、修正するための、プロアクティブな戦略と実践的なデバッグ手法を紹介します。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors