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.
The following section covers the installation of mtg_parser
.
Before using mtg_parser
, you will need:
python >= 3.8.1
To install mtg_parser
, simply run one of the following commands in the terminal of your choice:
$ pip install mtg-parser
or
$ poetry add mtg-parser
Note
mtg_parser
has 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
- infinite.tcgplayer.com
- decks.tcgplayer.com
Parsing decklists on some websites require a bit more work:
- Moxfield.com requires a custom User-Agent (see here)
Start by importing the mtg_parser
module:
import mtg_parser
Now let's parse a decklist (in any of the supported formats) and display the cards:
cards = mtg_parser.parse_deck(url)
for card in cards:
print(card)
parse_deck()
methods return a generator of Card
objects matching the following description
class Card:
name: str
quantity: int = 1
extension: Optional[str] = None
number: Optional[str] = None
tags: List[str] = []
mtg_parser.parse_deck()
is a shortcut method to the specialized versions.
If url
is a valid Moxfield url, the following lines are equivalent:
cards = mtg_parser.parse_deck(url)
# is the same as:
cards = mtg_parser.moxfield.parse_deck(url)
In general, it's advised to use mtg_parser.parse_deck()
as the overhead is insignificant.
If for any reason, you need to configure how mtg_parser
fetches remote decklists, you can provide an optional httpx.Client
object.
import httpx
headers = {'user-agent': 'my-custom-user-agent/0.0.1'}
with httpx.Client(headers=headers) as client:
cards = mtg_parser.parse_deck(url, http_client=client)
for card in cards:
print(card)
If no httpx.Client
object is provided, one will be created for you.
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)
# or the less recommended form:
# cards = mtg_parser.decklist.parse_deck(deck_list)
for card in cards:
print(card)
mtg_parser
can parse public decks from aetherhub.com
import mtg_parser
url = 'https://aetherhub.com/Deck/<deck_name>'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.aetherhub.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse public decks from archidekt.com
import mtg_parser
url = 'https://www.archidekt.com/decks/<deck_id>/'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.archidekt.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse public decks from deckstats.net
import mtg_parser
url = 'https://deckstats.net/decks/<user_id>/<deck_id>'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.deckstats.parse_deck(url)
for card in cards:
print(card)
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 client:
cards = mtg_parser.parse_deck(url, http_client=client)
# or the less recommended form:
# cards = mtg_parser.moxfield.parse_deck(url, http_client=client)
for card in cards:
print(card)
mtg_parser
can parse public decks from mtggoldfish.com
import mtg_parser
url = 'https://www.mtggoldfish.com/deck/<deck_id>'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.mtggoldfish.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse decks from mtgjson.com
import mtg_parser
url = 'https://mtgjson.com/api/v5/decks/<deck_name>.json'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.mtgjson.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse public decks from scryfall.com
import mtg_parser
url = 'https://scryfall.com/<userid>/decks/<deck_id>/'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.scryfall.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse public decks from tappedout.net
import mtg_parser
url = 'https://tappedout.net/mtg-decks/<deck_id>/'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.tappedout.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse public decks from infinite.tcgplayer.com
import mtg_parser
url = 'https://infinite.tcgplayer.com/magic-the-gathering/deck/<deck_name>/<deck_id>'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.tcgplayer_infinite.parse_deck(url)
for card in cards:
print(card)
mtg_parser
can parse public decks from decks.tcgplayer.com
import mtg_parser
url = 'https://decks.tcgplayer.com/magic/commander/<user_name>/<deck_name>/<deck_id>'
cards = mtg_parser.parse_deck(url)
# or the less recommended form:
# cards = mtg_parser.tcgplayer.parse_deck(url)
for card in cards:
print(card)