{"id":17720341,"url":"https://github.com/masaccio/numbers-parser","last_synced_at":"2026-02-10T13:01:35.954Z","repository":{"id":38336763,"uuid":"340151628","full_name":"masaccio/numbers-parser","owner":"masaccio","description":"Python module for parsing Apple Numbers .numbers files","archived":false,"fork":false,"pushed_at":"2026-02-09T17:23:12.000Z","size":29876,"stargazers_count":234,"open_issues_count":4,"forks_count":19,"subscribers_count":6,"default_branch":"main","last_synced_at":"2026-02-09T19:43:42.670Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/masaccio.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.rst","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2021-02-18T19:10:39.000Z","updated_at":"2026-02-09T17:23:16.000Z","dependencies_parsed_at":"2023-09-22T04:15:47.298Z","dependency_job_id":"fcf363b4-a0f9-4629-a86b-8f5e70d54ddc","html_url":"https://github.com/masaccio/numbers-parser","commit_stats":{"total_commits":784,"total_committers":12,"mean_commits":65.33333333333333,"dds":0.3380102040816326,"last_synced_commit":"eef04ac1ed08b160a0b623592f165db02a91a246"},"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/masaccio/numbers-parser","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masaccio%2Fnumbers-parser","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masaccio%2Fnumbers-parser/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masaccio%2Fnumbers-parser/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masaccio%2Fnumbers-parser/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/masaccio","download_url":"https://codeload.github.com/masaccio/numbers-parser/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/masaccio%2Fnumbers-parser/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29299543,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T12:55:56.056Z","status":"ssl_error","status_checked_at":"2026-02-10T12:55:55.692Z","response_time":65,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-25T15:26:42.175Z","updated_at":"2026-02-10T13:01:35.947Z","avatar_url":"https://github.com/masaccio.png","language":"Python","readme":"# numbers-parser\n\n[![Test Status](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml/badge.svg)](https://github.com/masaccio/numbers-parser/actions/workflows/run-all-tests.yml)[![Security Checks](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml/badge.svg)](https://github.com/masaccio/numbers-parser/actions/workflows/codeql.yml)[![Code Coverage](https://codecov.io/gh/masaccio/numbers-parser/branch/main/graph/badge.svg?token=EKIUFGT05E)](https://codecov.io/gh/masaccio/numbers-parser)[![PyPI Version](https://badge.fury.io/py/numbers-parser.svg)](https://badge.fury.io/py/numbers-parser)\n\n`numbers-parser` is a Python module for reading and editing [Apple Numbers](https://www.apple.com/numbers/)`.numbers` files. It supports Numbers files generated by Numbers versions 3.x and later. It is tested against Numbers documents from 10.0 through to 14.4 (the last version of Numbers) and Numbers Creator Studio up to version 15.1, which the most current as of February 2026.\n\nIt supports and is tested against Python versions from 3.10 onwards. It is not compatible with earlier versions of Python.\n\n## Installation\n\nA pre-requisite for this package is [python-snappy](https://pypi.org/project/python-snappy/) which will be installed by Python automatically, but python-snappy also requires binary libraries for snappy compression.\n\nThe most straightforward way to install the binary dependencies is to use [Homebrew](https://brew.sh) and source Python from Homebrew rather than from macOS as described in the [python-snappy github](https://github.com/andrix/python-snappy). Using [pipx](https://pipx.pypa.io/stable/installation/) for package management is also strongly recommended:\n\n```bash\nbrew install snappy python3 pipx\npipx install numbers-parser\n```\n\nFor Linux (your package manager may be different):\n\n```bash\nsudo apt-get -y install libsnappy-dev\n```\n\nOn Windows, you will need to either arrange for snappy to be found for VSC++ or you can install python [pre-compiled binary libraries](https://github.com/cgohlke/win_arm64-wheels/) which are only available for Windows on Arm. There appear to be no x86 pre-compiled packages for Windows.\n\n```text\npip install python_snappy-0.6.1-cp312-cp312-win_arm64.whl\n```\n\n## Quick Start\n\nReading documents:\n\n```python\n\u003e\u003e\u003e from numbers_parser import Document\n\u003e\u003e\u003e doc = Document(\"mydoc.numbers\")\n\u003e\u003e\u003e sheets = doc.sheets\n\u003e\u003e\u003e tables = sheets[0].tables\n\u003e\u003e\u003e rows = tables[0].rows()\n```\n\nSheets and tables are iterables that can be indexed using either an\ninteger index or using the name of the sheet/table:\n\n```python\n\u003e\u003e\u003e doc.sheets[0].name\n'Sheet 1'\n\u003e\u003e\u003e doc.sheets[\"Sheet 1\"].name\n'Sheet 1'\n\u003e\u003e\u003e doc.sheets[0].tables[0].name\n'Table 1'\n\u003e\u003e\u003e doc.sheets[0].tables[\"Table 1\"].name\n'Table 1'\n```\n\n`Table` objects have a `rows` method which contains a nested list\nwith an entry for each row of the table. Each row is itself a list of\nthe column values.\n\n```python\n\u003e\u003e\u003e data = sheets[\"Sheet 1\"].tables[\"Table 1\"].rows()\n\u003e\u003e\u003e data[0][0]\n\u003cnumbers_parser.cell.EmptyCell object at 0x1022b5710\u003e\n\u003e\u003e\u003e data[1][0]\n\u003cnumbers_parser.cell.TextCell object at 0x101eb6790\u003e\n\u003e\u003e\u003e data[1][0].value\n'Debit'\n```\n\n### Cell Data\n\nCells are objects with a common base class of `Cell`. All cell types\nhave a property `value` which returns the contents of the cell as a\npython datatype. Available cell types are:\n\n| Cell type    | value type           | Additional properties                                                                                  |\n|--------------|----------------------|--------------------------------------------------------------------------------------------------------|\n| NumberCell   | `float`              |                                                                                                        |\n| TextCell     | `str`                |                                                                                                        |\n| RichTextCell | `str`                | See [Rich text](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.RichTextCell)  |\n| EmptyCell    | `None`               |                                                                                                        |\n| BoolCell     | `bool`               |                                                                                                        |\n| DateCell     | `datetime.datetime`  |                                                                                                        |\n| DurationCell | `datetime.timedelta` |                                                                                                        |\n| ErrorCell    | `None`               |                                                                                                        |\n| MergedCell   | `None`               | See [Merged cells](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.MergedCell) |\n\nCell references can be either zero-offset row/column integers or an Excel/Numbers A1 notation. Where cell values are not `None` the property `formatted_value` returns the cell value as a `str` as displayed in Numbers. Cells that have no values in a table are represented as `EmptyCell` and cells containing evaluation errors of any kind `ErrorCell`.\n\n```python\n\u003e\u003e\u003e table.cell(1,0)\n\u003cnumbers_parser.cell.TextCell object at 0x1019ade50\u003e\n\u003e\u003e\u003e table.cell(1,0).value\n'Debit'\n\u003e\u003e\u003e table.cell(\"B2\")\n\u003cnumbers_parser.cell.NumberCell object at 0x103a99790\u003e\n\u003e\u003e\u003e table.cell(\"B2\").value\n1234.5\n\u003e\u003e\u003e table.cell(\"B2\").formatted_value\n'£1,234.50'\n```\n\n### Pandas Support\n\nSince the return value of `rows()` is a list of lists, you can pass this directly to pandas. Assuming you have a Numbers table with a single header which contains the names of the pandas series you want to create you can construct a pandas dataframe using:\n\n```python\nimport pandas as pd\n\ndoc = Document(\"simple.numbers\")\nsheets = doc.sheets\ntables = sheets[0].tables\ndata = tables[0].rows(values_only=True)\ndf = pd.DataFrame(data[1:], columns=data[0])\n```\n\n### Writing Numbers Documents\n\nWhilst support for writing numbers files has been stable since version 3.4.0, you are highly recommended not to overwrite working Numbers files and instead save data to a new file.\n\nCell values are written using [Table.write()](https://masaccio.github.io/numbers-parser/api/table.html#numbers_parser.Table.write) and `numbers-parser` will automatically create empty rows and columns for any cell references that are out of range of the current table.\n\n```python\ndoc = Document(\"write.numbers\")\nsheets = doc.sheets\ntables = sheets[0].tables\ntable = tables[0]\ntable.write(1, 1, \"This is new text\")\ntable.write(\"B7\", datetime(2020, 12, 25))\ndoc.save(\"new-sheet.numbers\")\n```\n\nAdditional tables and worksheets can be added to a `Document` before saving using [Document.add_sheet()](https://masaccio.github.io/numbers-parser/api/document.html#numbers_parser.Document.add_sheet) and [Sheet.add_table()](https://masaccio.github.io/numbers-parser/api/sheet.html#numbers_parser.Sheet.add_table) respectively:\n\n```python\ndoc = Document()\ndoc.add_sheet(\"New Sheet\", \"New Table\")\nsheet = doc.sheets[\"New Sheet\"]\ntable = sheet.tables[\"New Table\"]\ntable.write(1, 1, 1000)\ntable.write(1, 2, 2000)\ntable.write(1, 3, 3000)\ndoc.save(\"sheet.numbers\")\n```\n\n### Styles\n\n`numbers_parser` currently only supports paragraph styles and cell\nstyles. The following styles are supported:\n\n- font attributes: bold, italic, underline, strikethrough\n- font selection and size\n- text foreground color\n- horizontal and vertical alignment\n- cell background color\n- cell background images\n- cell indents (first line, left, right, and text inset)\n\nNumbers conflates style attributes that can be stored in paragraph styles (the style menu in the text panel) with the settings that are available on the Style tab of the Text panel. Some attributes in Numbers are not applied to new cells when a style is applied.\n\nTo keep the API simple, `numbers-parser` packs all styling into a single [Style](https://masaccio.github.io/numbers-parser/api/style.html) object. When a document is saved, the attributes not stored in a paragraph style are applied to each cell that includes it.\n\nStyles are read from cells using the [Cell.style](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.Cell.style) property and you can add new styles with [Document.add_style](https://masaccio.github.io/numbers-parser/api/document.html#numbers_parser.Document.add_style).\n\n```python\nred_text = doc.add_style(\n    name=\"Red Text\",\n    font_name=\"Lucida Grande\",\n    font_color=RGB(230, 25, 25),\n    font_size=14.0,\n    bold=True,\n    italic=True,\n    alignment=Alignment(\"right\", \"top\"),\n)\ntable.write(\"B2\", \"Red\", style=red_text)\ntable.set_cell_style(\"C2\", red_text)\n```\n\n### Cell Data Formatting\n\nNumbers has two different cell formatting types: data formats and custom formats.\n\nData formats are presented in Numbers in the Cell tab of the Format pane and are applied to individual cells. Like Numbers, `numbers-parsers` caches formatting information that is identical across multiple cells. You do not need to take any action for this to happen; this is handled internally by the package. Changing a data format for cell has no impact on any other cells.\n\nCell formats are changed using [Table.set_cell_formatting()](https://masaccio.github.io/numbers-parser/api/table.html#numbers_parser.Table.set_cell_formatting):\n\n```python\ntable.set_cell_formatting(\n   \"C1\",\n   \"datetime\",\n   date_time_format=\"EEEE, d MMMM yyyy\"\n)\ntable.set_cell_formatting(\n   0,\n   4,\n   \"number\",\n   decimal_places=3,\n   negative_style=NegativeNumberStyle.RED\n)\n```\n\nCustom formats are shared across a Document and can be applied to multiple cells in multiple tables. Editing a custom format changes the appearance of data in all cells that share that format. You must first add a custom format to the document using [Document.add_custom_format()](https://masaccio.github.io/numbers-parser/api/document.html#numbers_parser.Document.add_custom_format) before assigning it to cells using [Table.set_cell_formatting()](https://masaccio.github.io/numbers-parser/api/table.html#numbers_parser.Table.set_cell_formatting):\n\n```python\nlong_date = doc.add_custom_format(\n   name=\"Long Date\",\n   type=\"datetime\",\n   date_time_format=\"EEEE, d MMMM yyyy\"\n)\ntable.set_cell_formatting(\"C1\", \"custom\", format=long_date)\n```\n\nA limited number of currencies are formatted using symbolic notation rather than an ISO code. These are defined in `numbers_parser.currencies` and match the ones chosen by Numbers. For example, US dollars are referred to as `US$` whereas Euros and British Pounds are referred to using their symbols of `€` and `£` respectively.\n\n### Borders\n\n`numbers-parser` supports reading and writing cell borders, though the interface for each differs. Individual cells can have each of their four borders tested, but when drawing new borders, these are set for the table to allow for drawing borders across multiple cells. Setting the border of merged cells is not possible unless the edge of the cells is at the end of the merged region.\n\nBorders are represented using the [Border](https://masaccio.github.io/numbers-parser/api/border.html) class that can be initialized with line width, color and line style. The current state of a cell border is read using the [Cell.border](https://masaccio.github.io/numbers-parser/api/cells.html#numbers_parser.Cell.border) property and [Table.set_cell_border()](https://masaccio.github.io/numbers-parser/api/table.html#numbers_parser.Table.set_cell_border) sets the border for a cell edge or a range of cells.\n\n## API\n\nFor more examples and details of all available classes and methods, see the [full API docs](https://masaccio.github.io/numbers-parser/).\n\n## Command-line scripts\n\nWhen installed from [PyPI](https://pypi.org/project/numbers-parser/),\na number of command-line scripts are installed:\n\n- `cat-numbers`: converts Numbers documents into CSV\n- `csv2numbers`: converts CSV files to Numbers documents\n- `unpack-numbers`: converts Numbers documents into JSON files for debug purposes\n\n### cat-numbers\n\nThis script dumps Numbers spreadsheets into Excel-compatible CSV format, iterating through all the spreadsheets passed on the command-line.\n\n```text\nusage: cat-numbers [-h] [-T | -S | -b] [-V] [--formulas] [--formatting]\n                  [-s SHEET] [-t TABLE] [--debug]\n                  [document ...]\n\nExport data from Apple Numbers spreadsheet tables\n\npositional arguments:\n  document              Document(s) to export\n\noptions:\n  -h, --help            show this help message and exit\n  -T, --list-tables     List the names of tables and exit\n  -S, --list-sheets     List the names of sheets and exit\n  -b, --brief           Don't prefix data rows with name of sheet/table\n                        (default: false)\n  -V, --version\n  --formulas            Dump formulas instead of formula results\n  --formatting          Dump formatted cells (durations) as they appear\n                        in Numbers\n  -s SHEET, --sheet SHEET\n                        Names of sheet(s) to include in export\n  -t TABLE, --table TABLE\n                        Names of table(s) to include in export\n  --debug               Enable debug logging\n```\n\nNote: `--formatting` will return different capitalization for 12-hour times due to differences between Numbers’ representation of these dates and `datetime.strftime`. Numbers in English locales displays 12-hour times with ‘am’ and ‘pm’, but `datetime.strftime` on macOS at least cannot return lower-case versions of AM/PM.\n\n### csv2numbers\n\nThis script converts Excel-compatible CSV files into Numbers documents. Output files can optionally be provided, but is none are provided, the output is created by replacing the input’s files suffix with .numbers. For example:\n\n```text\ncsv2numbers file1.csv file2.csv -o file1.numbers file2.numbers\n```\n\nColumns of data can have a number of transformations applied to them. The primary use- case intended for `csv2numbers` is converting banking exports to well-formatted spreadsheets.\n\n```text\nusage: csv2numbers [-h] [-V] [--whitespace] [--reverse] [--no-header]\n                   [--day-first] [--date COLUMNS] [--rename COLUMNS-MAP]\n                   [--transform COLUMNS-MAP] [--delete COLUMNS]\n                   [-o [FILENAME ...]]\n                   [csvfile ...]\n\npositional arguments:\n  csvfile               CSV file to convert\n\noptions:\n  -h, --help            show this help message and exit\n  -V, --version\n  --whitespace          strip whitespace from beginning and end of strings\n                        and collapse other whitespace into single space\n                        (default: false)\n  --reverse             reverse the order of the data rows (default:\n                        false)\n  --no-header           CSV file has no header row (default: false)\n  --day-first           dates are represented day first in the CSV file\n                        (default: false)\n  --date COLUMNS        comma-separated list of column names/indexes to\n                        parse as dates\n  --rename COLUMNS-MAP  comma-separated list of column names/indexes to\n                        renamed as 'OLD:NEW'\n  --transform COLUMNS-MAP\n                        comma-separated list of column names/indexes to\n                        transform as 'NEW:FUNC=OLD'\n  --delete COLUMNS      comma-separated list of column names/indexes to\n                        delete\n  -o [FILENAME ...], --output [FILENAME ...]\n                        output filename (default: use source file with\n                        .numbers)\n```\n\nThe following options affecting the output of the entire file. The default for each is always false.\n\n- `--whitespace`: strip whitespace from beginning and end of strings and collapse other whitespace into single space\n- `--reverse`: reverse the order of the data rows\n- `--no-header`: CSV file has no header row\n- ``--day-first`: dates are represented day first in the CSV file\n\n`csv2numbers` can also perform column manipulation. Columns can be identified using their name if the CSV file has a header or using a column index. Columns are zero-indexed and names and indices can be used together on the same command-line. When multiple columns are required, you can specify them using comma-separated values. The format for these arguments, like for the CSV file itself, the Excel dialect.\n\n#### Deleting columns\n\nDelete columns using `--delete`. The names or indices of the columns to delete are specified as comma-separated values:\n\n```text\ncsv2numbers file1.csv --delete=Account,3\n```\n\n#### Renaming columns\n\nRename columns using `--rename`. The current column name and new column name are separated by a `:` and each renaming is specified as comma-separated values:\n\n```text\ncsv2numbers file1.csv --rename=2:Account,\"Paid In\":Amount\n```\n\n#### Date columns\n\nThe `--date` option identifies a comma-separated list of columns that should be parsed as dates. Use `--day-first` where the day and month is ambiguous anf the day comes first rather than the month.\n\n#### Transforming columns\n\nColumns can be merged and new columns created using simple functions. The –transform option takes a comma-seperated list of transformations of the form NEW:FUNC=OLD. Supported functions are:\n\n| Function   | Arguments                   | Description                                                                                                                                                                                                                                                                                                                                           |\n|------------|-----------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| MERGE      | dest=MERGE:source           | The dest column is writen with values from one or more columns\u003cbr/\u003eindicated by source. For multiple columns, which are separated\u003cbr/\u003eby ;, the first empty value is chosen.                                                                                                                                                                          |\n| NEG        | dest=NEG:source             | The dest column contains absolute values of any column that is\u003cbr/\u003enegative. This is useful for isolating debits from account\u003cbr/\u003eexports.                                                                                                                                                                                                            |\n| POS        | dest=NEG:source             | The dest column contains values of any column that is\u003cbr/\u003epositive. This is useful for isolating credits from account\u003cbr/\u003eexports.                                                                                                                                                                                                                    |\n| LOOKUP     | dest=LOOKUP:source;filename | A lookup map is read from filename which must be an Apple\u003cbr/\u003eNumbers file containing a single table of two columns. The table\u003cbr/\u003eis used to match agsinst source, searching the first column\u003cbr/\u003efor matches and writing the corresponding value from the second\u003cbr/\u003ecolumn to dest. Values are chosen based on the longest\u003cbr/\u003ematching substring. |\n\nExamples:\n\n```text\ncsv2numbers --transform=\"Paid In\"=POS:Amount,Withdrawn=NEG:Amount file1.csv\ncsv2numbers --transform='Category=LOOKUP:Transaction;mapping.numbers' file1.csv\n```\n\n## Limitations\n\nCurrent known limitations of `numbers-parser` which may be implemented in the future are:\n\n- Table styles that allow new tables to adopt a style across the whole table are not supported\n- Creating cells of type `BulletedTextCell` is not supported\n- New tables are inserted with a fixed offset below the last table in a worksheet which does not take into account title or caption size\n- Captions can be created and edited as of numbers-parser version 4.12, but cannot be styled. New captions adopt the first caption style available in the current document\n- Formulas cannot be written to a document\n- Pivot tables are unsupported and saving a document with a pivot table issues a UnsupportedWarning (see [issue 73](https://github.com/masaccio/numbers-parser/issues/73) for details).\n- Tables which have been saved grouped cannot be safely edited as references to written cells refer to the ungrouped cell rows rather than the row number in the groups.\n\nThe following limitations are expected to always remain:\n\n- New sheets insert tables with formats copied from the first table in the previous sheet rather than default table formats\n- Due to a limitation in Python’s [ZipFile](https://docs.python.org/3/library/zipfile.html), Python versions older than 3.11 do not support image filenames with UTF-8 characters [Cell.add_style.bg_image()](https://masaccio.github.io/numbers-parser/api/sheet.html#numbers_parser.Style) returns `None` for such files and issues a `RuntimeWarning` (see [issue 69](https://github.com/masaccio/numbers-parser/issues/69) for details).\n- Password-encrypted documents cannot be opened. You must first re-save without a password to read (see [issue 88](https://github.com/masaccio/numbers-parser/issues/88) for details).  A UnsupportedError exception is raised when such documents are opened.\n- Due to changes in the format of Numbers documents, decoding of category groups (introduced in `numbers-parser` version 4.16) is supported only for documents created by Numbers 12.0 and later. No warnings are issued for earlier\n  Numbers documents.\n- Only standard macOS fonts are not supported. If a document includes a non-standard font, numbers-parser will issue a UnsupportedWarning and default styles to Helvetica Neue. Reading font names from the system would add additional system-specific dependencies to the package and so this is not planned to changed.\n\n## License\n\nAll code in this repository is licensed under the [MIT License](https://github.com/masaccio/numbers-parser/blob/master/LICENSE.rst).\n","funding_links":[],"categories":["Python"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmasaccio%2Fnumbers-parser","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmasaccio%2Fnumbers-parser","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmasaccio%2Fnumbers-parser/lists"}