Magic: the Gathering decklist parser
Project description
mtg-parser
mtg_parser is a Python library to download and parse Magic: The Gathering decklists.
It supports the MTGO/MTGA formats as well as the most popular deck building websites.
Table of contents
Installation
The following section covers the installation of mtg_parser.
Before using mtg_parser, you will need:
python>=3.9
To install mtg_parser, simply run one of the following commands in the terminal of your choice:
$ pip install mtg-parser
# or
$ uv add mtg-parser
# or
$ poetry add mtg-parser
Supported Formats
[!NOTE]
mtg_parserhas been developed with a primary focus on Commander. While it may function with other formats, compatibility is not guaranteed.
In addition to MTGO and MTGA formats, mtg_parser supports the following websites:
- aetherhub.com
- archidekt.com
- deckstats.net
- moxfield.com
- mtggoldfish.com
- mtgjson.com
- scryfall.com
- tappedout.net
- tcgplayer.com
Known issues
Parsing decklists on some websites require specific configuration:
- aetherhub.com requires a Cloudflare-bypass
requestscompatible http client such ascloudscraper - deckstats.net requires a Cloudflare-bypass
requestscompatible http client such ascloudscraper - moxfield.com requires a custom User-Agent (see here)
Usage
QuickStart
[!NOTE] As of
mtg_parser="=>0.0.1a50"doesn't provide a default http client anymore.
To parse a decklist with mtg_parser, you need to provide an HTTP client that implements a requests compatible interface (such as requests or httpx).
import requests
import mtg_parser
cards = mtg_parser.parse_deck(url, requests.Session())
For conveniency, mtg_parser provides an optional HttpClientFacade to facilitate handling of different websites with different http clients.
import cloudscraper
import httpx
import mtg_parser
client_facade = mtg_parser.HttpClientFacade(httpx.Client(timeout=10.0))
client_facade.set_override('aetherhub.com', cloudscraper.create_scraper())
client_facade.set_override('moxfield.com', httpx.Client(
timeout=10.0,
headers={'User-Agent': os.getenv('MOXFIELD_USER_AGENT')},
))
cards = mtg_parser.parse_deck(url, client_facade)
Return format
parse_deck() returns an Iterable[Card] matching the following description
class Card:
name: str
quantity: int
extension: Optional[str]
number: Optional[str]
tags: Iterable[str] = []
cards = mtg_parser.parse_deck(url, http_client)
for card in cards:
print(card)
Parsing MTGO / MTGA
mtg_parser can parse textual decklists in either MTGO or MTGA format
import mtg_parser
decklist = """
1 Atraxa, Praetors' Voice
1 Imperial Seal
1 Lim-Dûl's Vault
1 Jeweled Lotus (CMR) 319
1 Llanowar Elves (M12) 182
3 Brainstorm #Card Advantage #Draw
"""
cards = mtg_parser.parse_deck(deck_list)
Parsing from aetherhub.com
mtg_parser can parse public decks from aetherhub.com
[!IMPORTANT] aetherhub.com requires a Cloudflare-bypass
requestscompatible http client such ascloudscraper.
import cloudscraper
import mtg_parser
url = 'https://aetherhub.com/Deck/<deck_name>'
cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())
Parsing from archidekt.com
mtg_parser can parse public decks from archidekt.com
import requests
import mtg_parser
url = 'https://www.archidekt.com/decks/<deck_id>/'
cards = mtg_parser.parse_deck(url, requests.Session())
Parsing from deckstats.net
mtg_parser can parse public decks from deckstats.net
[!IMPORTANT] deckstats.net requires a Cloudflare-bypass
requestscompatible http client such ascloudscraper.
import cloudscraper
import mtg_parser
url = 'https://deckstats.net/decks/<user_id>/<deck_id>'
cards = mtg_parser.parse_deck(url, cloudscraper.create_scraper())
Parsing from moxfield.com
mtg_parser can parse public decks from moxfield.com
[!IMPORTANT] Moxfield.com prohibits scraping their website, as it violates their Terms of Service.
For authorized access, please contact support@moxfield.com to request a custom User-Agent.
import httpx
import mtg_parser
url = 'https://www.moxfield.com/decks/<deck_id>'
headers = {'user-agent': '<MOXFIELD_USER_AGENT>'}
with httpx.Client(headers=headers) as http_client:
cards = mtg_parser.parse_deck(url, http_client)
Parsing from mtggoldfish.com
mtg_parser can parse public decks from mtggoldfish.com
import requests
import mtg_parser
url = 'https://www.mtggoldfish.com/deck/<deck_id>'
cards = mtg_parser.parse_deck(url, requests.Session())
Parsing from mtgjson.com
mtg_parser can parse decks from mtgjson.com
import requests
import mtg_parser
url = 'https://mtgjson.com/api/v5/decks/<deck_name>.json'
cards = mtg_parser.parse_deck(url, requests.Session())
Parsing from scryfall.com
mtg_parser can parse public decks from scryfall.com
import requests
import mtg_parser
url = 'https://scryfall.com/<userid>/decks/<deck_id>/'
cards = mtg_parser.parse_deck(url, requests.Session())
Parsing from tappedout.net
mtg_parser can parse public decks from tappedout.net
import requests
import mtg_parser
url = 'https://tappedout.net/mtg-decks/<deck_id>/'
cards = mtg_parser.parse_deck(url, requests.Session())
Parsing from tcgplayer.com
mtg_parser can parse public decks from either tcgplayer.com or infinite.tcgplayer.com
import requests
import mtg_parser
url = 'https://www.tcgplayer.com/content/magic-the-gathering/deck/<deck_name>/<deck_id>'
# or url = 'https://infinite.tcgplayer.com/magic-the-gathering/deck/<deck_name>/<deck_id>'
cards = mtg_parser.parse_deck(url, requests.Session())
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mtg_parser-0.0.1a51.tar.gz.
File metadata
- Download URL: mtg_parser-0.0.1a51.tar.gz
- Upload date:
- Size: 16.4 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.14.2 Darwin/23.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
35428d3773c8436d15692459e91800c14a4ecbf3b3e42cca2ef80ed7a1d1382c
|
|
| MD5 |
6f2d5116a2b303cdeb1fbd375bd392ad
|
|
| BLAKE2b-256 |
445e0906a0c7fb7ad74999b883e52fb8d5a22afd11315fa94a912949ff0c67c2
|
File details
Details for the file mtg_parser-0.0.1a51-py3-none-any.whl.
File metadata
- Download URL: mtg_parser-0.0.1a51-py3-none-any.whl
- Upload date:
- Size: 20.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: poetry/2.3.2 CPython/3.14.2 Darwin/23.5.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ea4fdc453a4c84fd93ecc4ada7c526f37bf7c90c274c3c82e6e83f82bd8dd4e
|
|
| MD5 |
7901492e51a53a0b9ef96773103a0f4b
|
|
| BLAKE2b-256 |
081e23a5dbb35c06c97691ebb92721ad1f4d90dbf4729964343cf9f128dff456
|