Skip to content

Instantly share code, notes, and snippets.

@dufferzafar
Last active January 26, 2016 23:53
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dufferzafar/36088f701bba507fd8f4 to your computer and use it in GitHub Desktop.
Save dufferzafar/36088f701bba507fd8f4 to your computer and use it in GitHub Desktop.
Timing execution of BeautifulSoup's prettify and lxml.tostring()
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The topic of pretty printing HTML came up in this issue on mitmproxy: https://github.com/mitmproxy/mitmproxy/issues/845\n",
"\n",
"mitmproxy currently uses lxml (tostring) to pretty print, but lxml seems to be adding some default doctype (even when it's not present in the source.) \n",
"\n",
"The (only?) other option is to use BeautifulSoup's prettify.\n",
"\n",
"But BeautifulSoup is Slow. \n",
"\n",
"I wrote this to find out just how slow it is..."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import requests\n",
"html_contents = requests.get(\"https://github.com/mitmproxy/mitmproxy/issues/845\").content"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"\"\"\"The functions that we will be testing.\"\"\"\n",
"\n",
"import lxml.html\n",
"import lxml.etree\n",
"\n",
"from bs4 import BeautifulSoup\n",
"\n",
"\n",
"def pretty_soup():\n",
" soup = BeautifulSoup(html_contents)\n",
" soup.prettify().encode('utf-8')\n",
"\n",
"\n",
"def pretty_lxml():\n",
" \"\"\"Taken from: https://github.com/mitmproxy/mitmproxy/blob/master/libmproxy/contentviews.py#L219-L230\"\"\"\n",
" parser = lxml.etree.HTMLParser(\n",
" strip_cdata=True,\n",
" remove_blank_text=True\n",
" )\n",
" d = lxml.html.fromstring(html_contents, parser=parser)\n",
" docinfo = d.getroottree().docinfo\n",
" lxml.etree.tostring(\n",
" d,\n",
" pretty_print=True,\n",
" doctype=docinfo.doctype,\n",
" encoding='utf8'\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import timeit\n",
"import matplotlib.pyplot as plt\n",
"\n",
"X = range(1, 1000, 100)\n",
"\n",
"# Time it!\n",
"Y_soup = []\n",
"Y_lxml = []\n",
"for x in X:\n",
" Y_soup.append(timeit.timeit(pretty_soup, number=x))\n",
" Y_lxml.append(timeit.timeit(pretty_lxml, number=x))"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAfcAAAF/CAYAAABUloCSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd8VHX2//HXIRA6BCzI2mLDsqtGsSBY2F1dddUVyyIW\nBHtDEcWGq+hX/am7oljWriBYUBcV1F3BQpQiICqooCJoRJBiAemQkPP7405iiElIYO7cuTPv5+Mx\nj8y90w7HMSefe+79fMzdERERkcxRL+oAREREJLlU3EVERDKMiruIiEiGUXEXERHJMCruIiIiGUbF\nXUREJMOEXtzNLMfMPjazVxPbrc3sTTObaWajzSwv7BhERESySSpG7r2BGUDZBfXXAm+6ezvg7cS2\niIiIJEmoxd3MtgH+CjwOWGL334CnEvefArqEGYOIiEi2CXvkfg9wFVBaYV8bd1+YuL8QaBNyDCIi\nIlkltOJuZscCi9z9Y34dta/Hg7lvNf+tiIhIEtUP8b07An8zs78CjYAWZjYUWGhmW7n7AjNrCyyq\n6sVmpqIvIiJZxd2rHAzXVWgjd3fv5+7buvsOQDfgHXfvDowEeiSe1gN4pYb30C3EW//+/SOPIdNv\nyrHynCk35Tj8WzKl8jr3ssjvAI4ws5nAnxLbEoGioqKoQ8h4ynFqKM/hU47jJczD8uXc/V3g3cT9\nn4HDU/G5IiIi2Ugz1GWxnj17Rh1CxlOOU0N5Dp9yHC+W7OP8yWJmnq6xiYiIJJuZ4el+Ql1YzEw3\n3TBLyvc/dIWFhVGHkBWU5/Apx/GSkp57smlEL3Ep7iIiUYjdYXkzU3EXfQ9EJOMkfq9l52F5ERER\nqZmKu0iI1KdMDeU5fMpxvKi4Z6hnnnmGI488snx7/Pjx7LLLLjRv3pyRI0fW+NqioiLq1atHaWlp\njc8TEZH0pJ57EuXn57No0SJycnJo0KABHTt25OGHH2abbbYJ9XOLiorYcccdKSkpoV69qv9e+/Of\n/0yXLl249NJLN/n9xo0bx9VXX82MGTPIyclh9913Z+DAgey3336b/G+prXT+HoiIbAz13NOUmfHa\na6+xbNky5s+fT5s2bWpVTJOlpmI3Z84c9thjj03+jKVLl3LsscfSu3dvFi9ezLx58+jfvz8NGzbc\n5PcWEZHkUHEPScOGDTnppJOYMWNG+b41a9bQt29ftt9+e7baaisuuugiVq9eDcCSJUs49thj2XLL\nLWndujXHHXcc8+bNK39tfn4+b7/9dvn2TTfdRPfu3QE49NBDAcjLy6NFixZMnDiRwYMHc8ghhwCw\n00478fXXX3PcccfRokUL1q5dW+P71WTmzJmYGaeccgpmRqNGjTjiiCPYc889geAPjFtvvZX8/Hza\ntGlDjx49WLp0KRD07Lbddtv13i8/P5933nmnPIaTTz6Zbt260aJFC9q3b88nn3xSy4ynJ/UpU0N5\nDp9yHC8q7klWNnpeuXIlzz//PAcddFD5Y9deey2zZs1i2rRpzJo1i3nz5vF///d/AJSWlnLOOecw\nZ84c5syZQ+PGjenVq1f5aytP3FLx/tixYwH45ZdfWLp0KR06dFgvptmzZ7Pddtvx2muvsXTpUnJz\nc2t8v5rsuuuu5OTk0LNnT9544w0WL1683uODBg3iqaeeorCwkK+//prly5ev9++orPLnjhw5kq5d\nu7J48WJOO+00unTpQklJSa1iExGRgIp7Erk7Xbp0oVWrVuTl5fH222/Tt2/f8scee+wx7r77bvLy\n8mjWrBnXXXcdw4YNA6B169accMIJNGrUiGbNmtGvXz/efffdGj+rqvubEnttNG/enHHjxmFmnHfe\neWy55ZYcf/zxLFq0CAhO5LvyyivJz8+nadOm3H777QwbNqzWJ+ftt99+nHjiieTk5HDFFVewevVq\nJk6cuNH/rqh17tw56hCygvIcPuU4XmI5Q11NkjVx2cbUSzNjxIgR/OlPf8LdeeWVVzjssMP4/PPP\ngWA03759+wqf4eVFb+XKlfTp04dRo0aVj4aXL1+Ou6fdbGy77bYbgwYNAuDLL7/kjDPO4PLLL+fZ\nZ59l/vz5bL/99uXP3W677SgpKWHhwoW1eu+KJx+aGdtssw3z589P7j9ARCTDZdzI3T05t01lZpxw\nwgnk5OQwbtw4Nt98cxo3bsyMGTNYvHgxixcvZsmSJeX96AEDBjBz5kwmT57ML7/8wrvvvou7l4+o\nmzZtyooVK8rff8GCBet9Vl3V9H51seuuu9KjRw8+++wzAH73u9+tt+7znDlzqF+/Pm3atKFp06as\nXLmy/LF169bxww8/rPd+3333Xfn90tJS5s6dy+9+97uNii0dqE+ZGspz+JTjeMm44h61smLs7owY\nMYLFixez++67U69ePc477zwuv/zy8oI2b948Ro8eDQSj9MaNG9OyZUt+/vlnbr755vXet6CggGHD\nhlFSUsKUKVMYPnx4eVHfYostqFevHrNnz651nDW9X02+/PJL7r777vKT/b777juee+658nMLTj31\nVO655x6KiopYvnw5/fr1o1u3btSrV4927dqxevVq/vvf/1JcXMytt97KmjVr1nv/Dz/8kJdffpmS\nkhIGDhxIo0aNfnMOgYiI1EzFPcmOO+44mjdvTsuWLbnhhhsYMmQIu+++OwB33nknO++8Mx06dKBl\ny5YcccQRzJw5E4DLL7+cVatWsfnmm9OxY0eOPvro9YrtLbfcwuzZs2nVqhU33XQTp59+evljTZo0\n4frrr6dTp060bt2aSZMmbXDltJreD6o/GtC8eXMmTZrEgQceSLNmzTjooIPYa6+9GDBgAABnn302\n3bt359BDD2XHHXekSZMm3H///QC0bNmSBx98kHPPPZdtttmGZs2arXf2vJlx/PHH8/zzz9O6dWue\neeYZXnrpJXJycurynyCtqE+ZGspz+JTjeNEkNpI2br75ZmbNmsXQoUM3+Fx9D0Qk02gSG8lImVis\n1adMDeU5fMpxvKi4S9rYUCtBRERqR4flJZb0PRCRTKPD8iIiIlItFXeREKlPmRrKc/iU43hRcRcR\nEckw6rlLLOl7ICKZRj13ERERqZaKe5JUXh89GXr27MkNN9yQ1PeU1FKfMjWU5/Apx/Gi4p4kYVyj\nreu+RURkY6i4pzn1leNN83GnhvIcPuU4XlTck8jdOeaYY+jbt2/5vm7dunHuuecCMHjwYDp16sQV\nV1xBq1at2HnnnZkwYQKDBg1iu+22o02bNgwZMiSq8EVEJEOouCeRmfHkk08ydOhQxowZwzPPPMOU\nKVO49957y58zefJk9t57b37++WdOPfVUunbtykcffcTs2bN5+umn6dWr13prnku8qU+ZGspz+JTj\neFFxT7I2bdrw0EMPceaZZ3L55ZczZMgQmjZtWv74DjvsQI8ePTAzunbtyvfff8+NN95IgwYNOOKI\nI8jNzWXWrFkR/gtERCTu6kcdQLLZzck5Ac37b3yv+9hjj6VXr17stttudOzYcb3H2rRpU36/cePG\nAGyxxRbr7Vu+fPlGf7akF/UpU0N5Dp9yHC+hFnczawS8CzQEcoER7n6dmd0EnAv8kHjqde7+RjI+\nc1OKcrJcf/317LHHHhQVFTFs2DC6desWdUgiIlnlySdhs83g+OOjjiQaoR6Wd/fVwB/dvQDYC/ij\n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\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f9b60447e80>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.figure(figsize=(8,6))\n",
"\n",
"plt.plot(X, Y_soup, 'b', label=\"Beautiful Soup\")\n",
"plt.plot(X, Y_lxml, 'g', label=\"lxml\")\n",
"\n",
"plt.xlabel('Iterations')\n",
"plt.ylabel('Time (seconds)')\n",
"plt.legend(loc='upper left')\n",
"plt.grid(True)\n",
"\n",
"plt.show()"
]
}
],
"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.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Copy link

ghost commented Jan 26, 2016

soup = BeautifulSoup(html_contents)

what decoder is being used here?

@dufferzafar
Copy link
Author

@Socialery I am not sure, what you mean. :/

@Justin42
Copy link

Beautiful Soup doesn't add this much overhead by itself. I believe the default parser is html.python, which is already quite a bit slower than lxml. It would be interesting to see the results of Beautiful Soup using the lxml parser. Any chance that could be added?

soup = BeautifulSoup(html_contents, "lxml")

Also, since html.python has had a lot of performance improvements between versions, it's probably a good idea to mention what version of python is being used.

@medecau
Copy link

medecau commented Jan 26, 2016

Beautifulsoup uses html.parser by default.
It is possible to use lxml as @Justin42 said.
http://www.crummy.com/software/BeautifulSoup/bs4/doc/#you-need-a-parser

I believe it is regarded by most people writing scrapers in python that lxml is the fastest parser.

@IAlwaysBeCoding
Copy link

I have used bs4 when I started out scraping and quickly switched to lxml, there is nothing better than lxml l. I just don't like how hard is to install, that's my only complain from lxml.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment