mirror of
https://github.com/jsvine/pdfplumber.git
synced 2026-08-29 16:40:24 +08:00
691 lines
70 KiB
Plaintext
691 lines
70 KiB
Plaintext
{
|
|
"cells": [
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"# Parsing San Jose PD's firearm search reports\n",
|
|
"\n",
|
|
"This example uses `pdfplumber`'s visual debugging and text-extraction features to parse a fixed-width table embedded in a PDF. Thanks to [Ron Campbell](https://twitter.com/campbellronaldw) for the sample PDF."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 1,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"0.11.3\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"import pdfplumber\n",
|
|
"import re\n",
|
|
"print(pdfplumber.__version__)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Load the PDF"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 2,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"pdf = pdfplumber.open(\"../pdfs/san-jose-pd-firearm-sample.pdf\")"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Examine the first page"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 3,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"p0 = pdf.pages[0]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 4,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<pdfplumber.display.PageImage at 0x1036a61e0>"
|
|
]
|
|
},
|
|
"execution_count": 4,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"im = p0.to_image()\n",
|
|
"im"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## See where the characters are on the page\n",
|
|
"\n",
|
|
"Below, we draw rectangles around each of the `char` objects that `pdfplumber` detected. By doing so, we can see that every line of the main part of the report is the same width, and that there are space (`\" \"`) characters padding out each field. That means we can parse those lines a lot like we'd parse a standard fixed-width data file."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 5,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"image/png": "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\n",
|
|
"text/plain": [
|
|
"<pdfplumber.display.PageImage at 0x1036a61e0>"
|
|
]
|
|
},
|
|
"execution_count": 5,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"im.reset().draw_rects(p0.chars)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Extract the text from the PDF\n",
|
|
"\n",
|
|
"Using the `Page.extract_text(...)` method, we grab every character on the page, line by line, using `keep_blank_chars=True` to retain all those whitespace characters as literal characters:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 6,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"For:1094N \n",
|
|
"Page 1 SAN JOSE POLICE DEPT Date Report Run : Tue, May-24-16\n",
|
|
" FIREARM SEARCH \n",
|
|
"SEARCH CRITERIA: fi_property.item_status='B' and fi_property.entry_date between '07/01/2012' and '05/24/2016' and fi_p\n",
|
|
" roperty.jurisdiction='SJ' \n",
|
|
"NUMBER OF RECORDS RETURNED: 983\n",
|
|
"TYPE ITEM MAKE MODEL CALIBRE STATUS FLAGS\n",
|
|
"-------------------- -------------------- --------------------------------------------- --------------- ------- -------- -----\n",
|
|
"SERIAL NUMBER REPORT/TAG NUMBER CASE/FILE NUMBER STORAGE LOCATION\n",
|
|
"------------- ------------------- -------------------- ----------------------- \n",
|
|
"PISTOL REVOLVER UNKWN/UNPUBLSHD MAKE UNKNOWN 38 FOUND _d__\n",
|
|
"1721 Tag#:SJ3095-1 GO SJ 2012-122590518 WA-GR/GUN DESTRUCTION \n",
|
|
"SHOTGUN DOUBLE BARREL STEVEN/J STVNS ARMS 311 SERIES H 12GA FOUND _d__\n",
|
|
"REMOVED Tag#:SJ3123-1 GO SJ 2012-122620320 WA-GR/GUN DESTRUCTION \n",
|
|
"PISTOL SEMI-AUTOMATIC TAURUS FORJAS PT40 PRO MIL'NU 40 FOUND _d__\n",
|
|
"SZH77919 Tag#:SJ3360-1 GO SJ 2012-122670386 WA-GR/GUN DESTRUCTION/G\n",
|
|
"PISTOL SEMI-AUTOMATIC SMITH AND WESSON 39 9MM FOUND _d__\n",
|
|
"85517 Tag#:SJ3686-1 GO SJ 2012-122741016 WA-GR/GUN DESTRUCTION/G\n",
|
|
"PISTOL SEMI-AUTOMATIC HIGH POINT JCP 40 FOUND ____\n",
|
|
"REMOVED Tag#:SJ3724-1 GO SJ 2012-122750582 WA-GR/GUN DESTRUCTION/G\n",
|
|
"PISTOL REVOLVER COLT DETECTIVE SPEC 38 FOUND _d__\n",
|
|
"982982 Tag#:SJ4077-2 GO SJ 2012-122840637 WA-GR/GUN DESTRUCTION/Z\n",
|
|
"SHOTGUN DOUBLE BARREL MISS.VALLEY ARMS CO. UNK 12GA FOUND _d__\n",
|
|
"279861 Tag#:SJ4117-1 GO SJ 2012-122850220 WA-GR/GUN DESTRUCTION \n",
|
|
"RIFLE LEVER ACTION SEARS ROEBUCK & CO. 5 22 FOUND _d__\n",
|
|
"63723 Tag#:SJ4172-1 GO SJ 2012-122860208 WA-GR/GUN DESTRUCTION \n",
|
|
"PISTOL SEMI-AUTOMATIC COLT MATCH TARGET .22 FOUND _d__\n",
|
|
"142061S Tag#:SJ4324-1 GO SJ 2012-122890285 WA-GR/GD-SCCCL \n",
|
|
"PISTOL REVOLVER SMITH AND WESSON UNKNOWN .22 FOUND _d__\n",
|
|
"K22539 Tag#:SJ4324-2 GO SJ 2012-122890285 WA-GR/GUN DESTRUCTION \n",
|
|
"RIFLE LEVER ACTION STEVEN/J STVNS ARMS CRACK SHOT 26 .22 FOUND _d__\n",
|
|
"UNKNOWN Tag#:SJ4324-3 GO SJ 2012-122890285 WA-GR/GUN DESTRUCTION \n",
|
|
"PISTOL SEMI-AUTOMATIC CARL WALTHER PPK 7.65 FOUND _d__\n",
|
|
"832229 Tag#:SJ4664-1 GO SJ 2012-122960284 WA-GR/GD-SCCCL \n",
|
|
" Flags = e (evidence) d (disposed) x (x-reference) n (entered on NCIC)\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"text = p0.extract_text(keep_blank_chars=True)\n",
|
|
"print(text)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Stripping away the header and footer\n",
|
|
"\n",
|
|
"In this step, we use a regular expression to focus on the core part of the page — the table."
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 7,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"core_pat = re.compile(r\"LOCATION[\\-\\s]+(.*)\\n\\s+Flags = e\", re.DOTALL)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 8,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"core = re.search(core_pat, text).group(1)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 9,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"PISTOL REVOLVER UNKWN/UNPUBLSHD MAKE UNKNOWN 38 FOUND _d__\n",
|
|
"1721 Tag#:SJ3095-1 GO SJ 2012-122590518 WA-GR/GUN DESTRUCTION \n",
|
|
"SHOTGUN DOUBLE BARREL STEVEN/J STVNS ARMS 311 SERIES H 12GA FOUND _d__\n",
|
|
"REMOVED Tag#:SJ3123-1 GO SJ 2012-122620320 WA-GR/GUN DESTRUCTION \n",
|
|
"PISTOL SEMI-AUTOMATIC TAURUS FORJAS PT40 PRO MIL'NU 40 FOUND _d__\n",
|
|
"SZH77919 Tag#:SJ3360-1 GO SJ 2012-122670386 WA-GR/GUN DESTRUCTION/G\n",
|
|
"PISTOL SEMI-AUTOMATIC SMITH AND WESSON 39 9MM FOUND _d__\n",
|
|
"85517 Tag#:SJ3686-1 GO SJ 2012-122741016 WA-GR/GUN DESTRUCTION/G\n",
|
|
"PISTOL SEMI-AUTOMATIC HIGH POINT JCP 40 FOUND ____\n",
|
|
"REMOVED Tag#:SJ3724-1 GO SJ 2012-122750582 WA-GR/GUN DESTRUCTION/G\n",
|
|
"PISTOL REVOLVER COLT DETECTIVE SPEC 38 FOUND _d__\n",
|
|
"982982 Tag#:SJ4077-2 GO SJ 2012-122840637 WA-GR/GUN DESTRUCTION/Z\n",
|
|
"SHOTGUN DOUBLE BARREL MISS.VALLEY ARMS CO. UNK 12GA FOUND _d__\n",
|
|
"279861 Tag#:SJ4117-1 GO SJ 2012-122850220 WA-GR/GUN DESTRUCTION \n",
|
|
"RIFLE LEVER ACTION SEARS ROEBUCK & CO. 5 22 FOUND _d__\n",
|
|
"63723 Tag#:SJ4172-1 GO SJ 2012-122860208 WA-GR/GUN DESTRUCTION \n",
|
|
"PISTOL SEMI-AUTOMATIC COLT MATCH TARGET .22 FOUND _d__\n",
|
|
"142061S Tag#:SJ4324-1 GO SJ 2012-122890285 WA-GR/GD-SCCCL \n",
|
|
"PISTOL REVOLVER SMITH AND WESSON UNKNOWN .22 FOUND _d__\n",
|
|
"K22539 Tag#:SJ4324-2 GO SJ 2012-122890285 WA-GR/GUN DESTRUCTION \n",
|
|
"RIFLE LEVER ACTION STEVEN/J STVNS ARMS CRACK SHOT 26 .22 FOUND _d__\n",
|
|
"UNKNOWN Tag#:SJ4324-3 GO SJ 2012-122890285 WA-GR/GUN DESTRUCTION \n",
|
|
"PISTOL SEMI-AUTOMATIC CARL WALTHER PPK 7.65 FOUND _d__\n",
|
|
"832229 Tag#:SJ4664-1 GO SJ 2012-122960284 WA-GR/GD-SCCCL \n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"print(core)"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Parse each group of two lines\n",
|
|
"\n",
|
|
"In the report, each firearm takes up two lines. The code below splits the core table into two-line groups, and then parses out the fields, based on the number of characters in each field:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 10,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"name": "stdout",
|
|
"output_type": "stream",
|
|
"text": [
|
|
"('PISTOL REVOLVER UNKWN/UNPUBLSHD MAKE UNKNOWN 38 FOUND _d__', '1721 Tag#:SJ3095-1 GO SJ 2012-122590518 WA-GR/GUN DESTRUCTION ')\n"
|
|
]
|
|
}
|
|
],
|
|
"source": [
|
|
"lines = core.split(\"\\n\")\n",
|
|
"line_groups = list(zip(lines[::2], lines[1::2]))\n",
|
|
"print(line_groups[0])"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 11,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"def parse_row(first_line, second_line):\n",
|
|
" return {\n",
|
|
" \"type\": first_line[:20].strip(),\n",
|
|
" \"item\": first_line[21:41].strip(),\n",
|
|
" \"make\": first_line[44:89].strip(),\n",
|
|
" \"model\": first_line[90:105].strip(),\n",
|
|
" \"calibre\": first_line[106:111].strip(),\n",
|
|
" \"status\": first_line[112:120].strip(),\n",
|
|
" \"flags\": first_line[124:129].strip(),\n",
|
|
" \"serial_number\": second_line[0:13].strip(),\n",
|
|
" \"report_tag_number\": second_line[21:41].strip(),\n",
|
|
" \"case_file_number\": second_line[44:64].strip(),\n",
|
|
" \"storage_location\": second_line[68:91].strip(),\n",
|
|
" }"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 12,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [],
|
|
"source": [
|
|
"parsed = [ parse_row(first_line, second_line) \n",
|
|
" for first_line, second_line in line_groups ]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Result\n",
|
|
"\n",
|
|
"Below, you can see the parsed data for the first two firearms in the report:"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 13,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/plain": [
|
|
"[{'type': 'PISTOL',\n",
|
|
" 'item': 'REVOLVER',\n",
|
|
" 'make': 'UNKWN/UNPUBLSHD MAKE',\n",
|
|
" 'model': 'UNKNOWN',\n",
|
|
" 'calibre': '38',\n",
|
|
" 'status': 'FOUND',\n",
|
|
" 'flags': '_d__',\n",
|
|
" 'serial_number': '1721',\n",
|
|
" 'report_tag_number': 'Tag#:SJ3095-1',\n",
|
|
" 'case_file_number': 'GO SJ 2012-1225905',\n",
|
|
" 'storage_location': 'WA-GR/GUN DESTRUCTION'},\n",
|
|
" {'type': 'SHOTGUN',\n",
|
|
" 'item': 'DOUBLE BARREL',\n",
|
|
" 'make': 'STEVEN/J STVNS ARMS',\n",
|
|
" 'model': '311 SERIES H',\n",
|
|
" 'calibre': '12GA',\n",
|
|
" 'status': 'FOUND',\n",
|
|
" 'flags': '_d__',\n",
|
|
" 'serial_number': 'REMOVED',\n",
|
|
" 'report_tag_number': 'Tag#:SJ3123-1',\n",
|
|
" 'case_file_number': 'GO SJ 2012-1226203',\n",
|
|
" 'storage_location': 'WA-GR/GUN DESTRUCTION'}]"
|
|
]
|
|
},
|
|
"execution_count": 13,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"parsed[:2]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"## Preview via `pandas.DataFrame`\n",
|
|
"\n",
|
|
"To make it a little easier to read, here's the full table, parsed and represented as a `pandas.DataFrame` (for ease of viewing):"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "code",
|
|
"execution_count": 14,
|
|
"metadata": {
|
|
"tags": []
|
|
},
|
|
"outputs": [
|
|
{
|
|
"data": {
|
|
"text/html": [
|
|
"<div>\n",
|
|
"<style scoped>\n",
|
|
" .dataframe tbody tr th:only-of-type {\n",
|
|
" vertical-align: middle;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe tbody tr th {\n",
|
|
" vertical-align: top;\n",
|
|
" }\n",
|
|
"\n",
|
|
" .dataframe thead th {\n",
|
|
" text-align: right;\n",
|
|
" }\n",
|
|
"</style>\n",
|
|
"<table border=\"1\" class=\"dataframe\">\n",
|
|
" <thead>\n",
|
|
" <tr style=\"text-align: right;\">\n",
|
|
" <th></th>\n",
|
|
" <th>type</th>\n",
|
|
" <th>item</th>\n",
|
|
" <th>make</th>\n",
|
|
" <th>model</th>\n",
|
|
" <th>calibre</th>\n",
|
|
" <th>status</th>\n",
|
|
" <th>flags</th>\n",
|
|
" <th>serial_number</th>\n",
|
|
" <th>report_tag_number</th>\n",
|
|
" <th>case_file_number</th>\n",
|
|
" <th>storage_location</th>\n",
|
|
" </tr>\n",
|
|
" </thead>\n",
|
|
" <tbody>\n",
|
|
" <tr>\n",
|
|
" <th>0</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>REVOLVER</td>\n",
|
|
" <td>UNKWN/UNPUBLSHD MAKE</td>\n",
|
|
" <td>UNKNOWN</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>1721</td>\n",
|
|
" <td>Tag#:SJ3095-1</td>\n",
|
|
" <td>GO SJ 2012-1225905</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>1</th>\n",
|
|
" <td>SHOTGUN</td>\n",
|
|
" <td>DOUBLE BARREL</td>\n",
|
|
" <td>STEVEN/J STVNS ARMS</td>\n",
|
|
" <td>311 SERIES H</td>\n",
|
|
" <td>12GA</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>REMOVED</td>\n",
|
|
" <td>Tag#:SJ3123-1</td>\n",
|
|
" <td>GO SJ 2012-1226203</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>2</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>SEMI-AUTOMATIC</td>\n",
|
|
" <td>TAURUS FORJAS</td>\n",
|
|
" <td>PT40 PRO MIL'NU</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>SZH77919</td>\n",
|
|
" <td>Tag#:SJ3360-1</td>\n",
|
|
" <td>GO SJ 2012-1226703</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION/G</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>3</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>SEMI-AUTOMATIC</td>\n",
|
|
" <td>SMITH AND WESSON</td>\n",
|
|
" <td>39</td>\n",
|
|
" <td>9MM</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>85517</td>\n",
|
|
" <td>Tag#:SJ3686-1</td>\n",
|
|
" <td>GO SJ 2012-1227410</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION/G</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>4</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>SEMI-AUTOMATIC</td>\n",
|
|
" <td>HIGH POINT</td>\n",
|
|
" <td>JCP</td>\n",
|
|
" <td>40</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>____</td>\n",
|
|
" <td>REMOVED</td>\n",
|
|
" <td>Tag#:SJ3724-1</td>\n",
|
|
" <td>GO SJ 2012-1227505</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION/G</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>5</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>REVOLVER</td>\n",
|
|
" <td>COLT</td>\n",
|
|
" <td>DETECTIVE SPEC</td>\n",
|
|
" <td>38</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>982982</td>\n",
|
|
" <td>Tag#:SJ4077-2</td>\n",
|
|
" <td>GO SJ 2012-1228406</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION/Z</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>6</th>\n",
|
|
" <td>SHOTGUN</td>\n",
|
|
" <td>DOUBLE BARREL</td>\n",
|
|
" <td>MISS.VALLEY ARMS CO.</td>\n",
|
|
" <td>UNK</td>\n",
|
|
" <td>12GA</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>279861</td>\n",
|
|
" <td>Tag#:SJ4117-1</td>\n",
|
|
" <td>GO SJ 2012-1228502</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>7</th>\n",
|
|
" <td>RIFLE</td>\n",
|
|
" <td>LEVER ACTION</td>\n",
|
|
" <td>SEARS ROEBUCK & CO.</td>\n",
|
|
" <td>5</td>\n",
|
|
" <td>22</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>63723</td>\n",
|
|
" <td>Tag#:SJ4172-1</td>\n",
|
|
" <td>GO SJ 2012-1228602</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>8</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>SEMI-AUTOMATIC</td>\n",
|
|
" <td>COLT</td>\n",
|
|
" <td>MATCH TARGET</td>\n",
|
|
" <td>.22</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>142061S</td>\n",
|
|
" <td>Tag#:SJ4324-1</td>\n",
|
|
" <td>GO SJ 2012-1228902</td>\n",
|
|
" <td>WA-GR/GD-SCCCL</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>9</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>REVOLVER</td>\n",
|
|
" <td>SMITH AND WESSON</td>\n",
|
|
" <td>UNKNOWN</td>\n",
|
|
" <td>.22</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>K22539</td>\n",
|
|
" <td>Tag#:SJ4324-2</td>\n",
|
|
" <td>GO SJ 2012-1228902</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>10</th>\n",
|
|
" <td>RIFLE</td>\n",
|
|
" <td>LEVER ACTION</td>\n",
|
|
" <td>STEVEN/J STVNS ARMS</td>\n",
|
|
" <td>CRACK SHOT 26</td>\n",
|
|
" <td>.22</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>UNKNOWN</td>\n",
|
|
" <td>Tag#:SJ4324-3</td>\n",
|
|
" <td>GO SJ 2012-1228902</td>\n",
|
|
" <td>WA-GR/GUN DESTRUCTION</td>\n",
|
|
" </tr>\n",
|
|
" <tr>\n",
|
|
" <th>11</th>\n",
|
|
" <td>PISTOL</td>\n",
|
|
" <td>SEMI-AUTOMATIC</td>\n",
|
|
" <td>CARL WALTHER</td>\n",
|
|
" <td>PPK</td>\n",
|
|
" <td>7.65</td>\n",
|
|
" <td>FOUND</td>\n",
|
|
" <td>_d__</td>\n",
|
|
" <td>832229</td>\n",
|
|
" <td>Tag#:SJ4664-1</td>\n",
|
|
" <td>GO SJ 2012-1229602</td>\n",
|
|
" <td>WA-GR/GD-SCCCL</td>\n",
|
|
" </tr>\n",
|
|
" </tbody>\n",
|
|
"</table>\n",
|
|
"</div>"
|
|
],
|
|
"text/plain": [
|
|
" type item make model calibre \\\n",
|
|
"0 PISTOL REVOLVER UNKWN/UNPUBLSHD MAKE UNKNOWN 38 \n",
|
|
"1 SHOTGUN DOUBLE BARREL STEVEN/J STVNS ARMS 311 SERIES H 12GA \n",
|
|
"2 PISTOL SEMI-AUTOMATIC TAURUS FORJAS PT40 PRO MIL'NU 40 \n",
|
|
"3 PISTOL SEMI-AUTOMATIC SMITH AND WESSON 39 9MM \n",
|
|
"4 PISTOL SEMI-AUTOMATIC HIGH POINT JCP 40 \n",
|
|
"5 PISTOL REVOLVER COLT DETECTIVE SPEC 38 \n",
|
|
"6 SHOTGUN DOUBLE BARREL MISS.VALLEY ARMS CO. UNK 12GA \n",
|
|
"7 RIFLE LEVER ACTION SEARS ROEBUCK & CO. 5 22 \n",
|
|
"8 PISTOL SEMI-AUTOMATIC COLT MATCH TARGET .22 \n",
|
|
"9 PISTOL REVOLVER SMITH AND WESSON UNKNOWN .22 \n",
|
|
"10 RIFLE LEVER ACTION STEVEN/J STVNS ARMS CRACK SHOT 26 .22 \n",
|
|
"11 PISTOL SEMI-AUTOMATIC CARL WALTHER PPK 7.65 \n",
|
|
"\n",
|
|
" status flags serial_number report_tag_number case_file_number \\\n",
|
|
"0 FOUND _d__ 1721 Tag#:SJ3095-1 GO SJ 2012-1225905 \n",
|
|
"1 FOUND _d__ REMOVED Tag#:SJ3123-1 GO SJ 2012-1226203 \n",
|
|
"2 FOUND _d__ SZH77919 Tag#:SJ3360-1 GO SJ 2012-1226703 \n",
|
|
"3 FOUND _d__ 85517 Tag#:SJ3686-1 GO SJ 2012-1227410 \n",
|
|
"4 FOUND ____ REMOVED Tag#:SJ3724-1 GO SJ 2012-1227505 \n",
|
|
"5 FOUND _d__ 982982 Tag#:SJ4077-2 GO SJ 2012-1228406 \n",
|
|
"6 FOUND _d__ 279861 Tag#:SJ4117-1 GO SJ 2012-1228502 \n",
|
|
"7 FOUND _d__ 63723 Tag#:SJ4172-1 GO SJ 2012-1228602 \n",
|
|
"8 FOUND _d__ 142061S Tag#:SJ4324-1 GO SJ 2012-1228902 \n",
|
|
"9 FOUND _d__ K22539 Tag#:SJ4324-2 GO SJ 2012-1228902 \n",
|
|
"10 FOUND _d__ UNKNOWN Tag#:SJ4324-3 GO SJ 2012-1228902 \n",
|
|
"11 FOUND _d__ 832229 Tag#:SJ4664-1 GO SJ 2012-1229602 \n",
|
|
"\n",
|
|
" storage_location \n",
|
|
"0 WA-GR/GUN DESTRUCTION \n",
|
|
"1 WA-GR/GUN DESTRUCTION \n",
|
|
"2 WA-GR/GUN DESTRUCTION/G \n",
|
|
"3 WA-GR/GUN DESTRUCTION/G \n",
|
|
"4 WA-GR/GUN DESTRUCTION/G \n",
|
|
"5 WA-GR/GUN DESTRUCTION/Z \n",
|
|
"6 WA-GR/GUN DESTRUCTION \n",
|
|
"7 WA-GR/GUN DESTRUCTION \n",
|
|
"8 WA-GR/GD-SCCCL \n",
|
|
"9 WA-GR/GUN DESTRUCTION \n",
|
|
"10 WA-GR/GUN DESTRUCTION \n",
|
|
"11 WA-GR/GD-SCCCL "
|
|
]
|
|
},
|
|
"execution_count": 14,
|
|
"metadata": {},
|
|
"output_type": "execute_result"
|
|
}
|
|
],
|
|
"source": [
|
|
"import pandas as pd\n",
|
|
"columns = list(parsed[0].keys())\n",
|
|
"pd.DataFrame(parsed)[columns]"
|
|
]
|
|
},
|
|
{
|
|
"cell_type": "markdown",
|
|
"metadata": {},
|
|
"source": [
|
|
"---\n",
|
|
"\n",
|
|
"---\n",
|
|
"\n",
|
|
"---"
|
|
]
|
|
}
|
|
],
|
|
"metadata": {
|
|
"kernelspec": {
|
|
"display_name": "Python 3 (ipykernel)",
|
|
"language": "python",
|
|
"name": "python3"
|
|
},
|
|
"language_info": {
|
|
"codemirror_mode": {
|
|
"name": "ipython",
|
|
"version": 3
|
|
},
|
|
"file_extension": ".py",
|
|
"mimetype": "text/x-python",
|
|
"name": "python",
|
|
"nbconvert_exporter": "python",
|
|
"pygments_lexer": "ipython3",
|
|
"version": "3.12.4"
|
|
}
|
|
},
|
|
"nbformat": 4,
|
|
"nbformat_minor": 4
|
|
}
|