Skip to content

Instantly share code, notes, and snippets.

@dschien
Created February 12, 2017 11:22
Show Gist options
  • Select an option

  • Save dschien/963fd0136bce1b238c51509687e25f7a to your computer and use it in GitHub Desktop.

Select an option

Save dschien/963fd0136bce1b238c51509687e25f7a to your computer and use it in GitHub Desktop.
Simple test to parse a gutenberg doc with python and beautiful soup
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# make some libraries availabe (equivalent to latex packages...)\n",
"\n",
"# for http requests\n",
"import requests\n",
"# beautiful soup\n",
"import bs4\n",
"from bs4 import BeautifulSoup\n",
"\n",
"# regexp\n",
"import re"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# kafka\n",
"url = 'https://www.gutenberg.org/files/22367/22367-h/22367-h.htm'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"# get the html doc\n",
"response = requests.get(url)\n",
"\n",
"# parse the html doc\n",
"soup = BeautifulSoup(response.content, 'html.parser')"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[<h2 class=\"page-break\"><a class=\"pagenum\" name=\"Page_5\" title=\"5\"> </a>I.</h2>, <h2>II.</h2>, <h2>III.</h2>]\n"
]
}
],
"source": [
"# find all chapters\n",
"chapters = soup.findAll('h2')\n",
"print(chapters)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"' I.'"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# test: get the text content \n",
"chapters[0].text"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'I.'"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# string manipulation, remove white space\n",
"chapters[0].text.strip()"
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'\\n'"
]
},
"execution_count": 18,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"chapters[0].next_sibling"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"parsing chapter I.\n",
"node not a para, stopping: h2\n",
"parsing chapter II.\n",
"node not a para, stopping: h2\n",
"parsing chapter III.\n",
"node not a para, stopping: pre\n",
"dict_keys(['III.', 'II.', 'I.'])\n",
"number of paras in chapter: 38\n",
"<p>Die schwere Verwundung Gregors, an der er über\r\n",
"einen Monat litt – der Apfel blieb, da ihn niemand\r\n",
"zu entfernen wagte, als sichtbares Andenken im Fleische\r\n",
"sitzen –, schien selbst den Vater daran erinnert zu\r\n",
"haben, daß Gregor trotz seiner gegenwärtigen traurigen\r\n",
"und ekelhaften Gestalt ein Familienglied war, das\r\n",
"man nicht wie einen Feind behandeln durfte, sondern\r\n",
"dem gegenüber es das Gebot der Familienpflicht war,\r\n",
"den Widerwillen hinunterzuschlucken und zu dulden,\r\n",
"nichts als dulden.</p>\n",
"number of paras in chapter: 29\n",
"<p>Erst in der Abenddämmerung erwachte Gregor aus\r\n",
"seinem schweren ohnmachtähnlichen Schlaf. Er wäre\r\n",
"gewiß nicht viel später auch ohne Störung erwacht,\r\n",
"denn er fühlte sich genügend ausgeruht und ausgeschlafen,\r\n",
"doch schien es ihm, als hätte ihn ein flüchtiger\r\n",
"Schritt und ein vorsichtiges Schließen der zum Vorzimmer\r\n",
"führenden Tür geweckt. Der Schein der elektrischen\r\n",
"Straßenbahn lag bleich hier und da auf der\r\n",
"Zimmerdecke und auf den höheren Teilen der Möbel,\r\n",
"aber unten bei Gregor war es finster. Langsam schob\r\n",
"er sich, noch ungeschickt mit seinen Fühlern tastend,\r\n",
"die er jetzt erst schätzen lernte, zur Türe hin, um\r\n",
"nachzusehen, was dort geschehen war. Seine linke Seite\r\n",
"schien eine einzige lange, unangenehm spannende Narbe,\r\n",
"und er mußte auf seinen zwei Beinreihen regelrecht\r\n",
"hinken. Ein Beinchen war übrigens im Laufe der vormittägigen\r\n",
"<a class=\"pagenum\" name=\"Page_28\" title=\"28\"> </a>\r\n",
"Vorfälle schwer verletzt worden – es war\r\n",
"fast ein Wunder, daß nur eines verletzt worden war –\r\n",
"und schleppte leblos nach.</p>\n",
"number of paras in chapter: 30\n",
"<p class=\"dropcap\"><span class=\"first-word\">Als</span> Gregor Samsa eines Morgens aus unruhigen\r\n",
"Träumen erwachte, fand er sich in seinem\r\n",
"Bett zu einem ungeheuren Ungeziefer verwandelt.\r\n",
"Er lag auf seinem panzerartig harten Rücken\r\n",
"und sah, wenn er den Kopf ein wenig hob, seinen\r\n",
"gewölbten, braunen, von bogenförmigen Versteifungen\r\n",
"geteilten Bauch, auf dessen Höhe sich die Bettdecke,\r\n",
"zum gänzlichen Niedergleiten bereit, kaum noch erhalten\r\n",
"konnte. Seine vielen, im Vergleich zu seinem\r\n",
"sonstigen Umfang kläglich dünnen Beine flimmerten ihm\r\n",
"hilflos vor den Augen.</p>\n"
]
}
],
"source": [
"# parse all p nodes in a map:\n",
"# chapter title: list of paras\n",
"chapter_map = {}\n",
"for chapter in chapters:\n",
" title = chapter.text.strip()\n",
" print('parsing chapter ', title)\n",
" paras = []\n",
" \n",
" nextNode = chapter\n",
" while True:\n",
" nextNode = nextNode.next_sibling\n",
" if nextNode == \"\\n\":\n",
" nextNode = nextNode.next_sibling\n",
"\n",
"# print(nextNode.name)\n",
" try:\n",
" tag_name = nextNode.name\n",
" except AttributeError:\n",
" tag_name = \"\"\n",
" if tag_name == \"p\":\n",
" paras.append(nextNode)\n",
" else:\n",
" print (\"node not a para, stopping: \", tag_name)\n",
" break\n",
" \n",
" chapter_map[title] = paras\n",
" \n",
"print (chapter_map.keys())\n",
"for chapter in chapter_map.keys():\n",
" print (\"number of paras in chapter: %s\" % len(chapter_map[chapter] ))\n",
" print (chapter_map[chapter][0] )"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"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.5.1"
},
"toc": {
"toc_cell": false,
"toc_number_sections": true,
"toc_threshold": 6,
"toc_window_display": false
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment