<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>dev.enekoalonso.com &#187; python</title>
	<atom:link href="http://dev.enekoalonso.com/tag/python/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.enekoalonso.com</link>
	<description>having fun with code</description>
	<lastBuildDate>Wed, 12 Oct 2011 21:40:17 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Python script: remove empty folders</title>
		<link>http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/</link>
		<comments>http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/#comments</comments>
		<pubDate>Sat, 06 Aug 2011 17:07:25 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[empty]]></category>
		<category><![CDATA[folders]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[remove]]></category>
		<category><![CDATA[script]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=718</guid>
		<description><![CDATA[One of the scripts I often use is this one to remove empty folders under a specific location on your hard drive. The usage is simple: $ &#91;path to the script&#93;/remove_empty_folders.py &#91;path_to_clean&#93; Here is the code: #! /usr/bin/env python import os, sys &#160; def removeEmptyFolders&#40;path&#41;: &#160; if not os.path.isdir&#40;path&#41;: &#160; &#160; return &#160; &#160; # [...]]]></description>
			<content:encoded><![CDATA[<p>One of the scripts I often use is this one to remove empty folders under a specific location on your hard drive. The usage is simple:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">$ <span class="br0">&#91;</span>path to the script<span class="br0">&#93;</span><span class="sy0">/</span>remove_empty_folders.py <span class="br0">&#91;</span>path_to_clean<span class="br0">&#93;</span></div>
</li>
</ol>
</div>
<p>Here is the code:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#! /usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">os</span>, <span class="kw3">sys</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> removeEmptyFolders<span class="br0">&#40;</span>path<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="kw1">not</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">isdir</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1"># remove empty subfolders</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; files = <span class="kw3">os</span>.<span class="me1">listdir</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span>files<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">for</span> f <span class="kw1">in</span> files:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; fullpath = <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">join</span><span class="br0">&#40;</span>path, f<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">os</span>.<span class="me1">path</span>.<span class="me1">isdir</span><span class="br0">&#40;</span>fullpath<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; removeEmptyFolders<span class="br0">&#40;</span>fullpath<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="co1"># if folder empty, delete it</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; files = <span class="kw3">os</span>.<span class="me1">listdir</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span>files<span class="br0">&#41;</span> == <span class="nu0">0</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;Removing empty folder:&quot;</span>, path</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">os</span>.<span class="me1">rmdir</span><span class="br0">&#40;</span>path<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">removeEmptyFolders<span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Here is a sample output:</p>
<div class="geshi no text">
<ol>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/13/20101213-202802</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/13</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/14/20101214-120800</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/14</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/01/20101201-070118</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/01/20101201-070111</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/01/20101201-070123</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12/01</div>
</li>
<li class="li1">
<div class="de1">Removing empty folder: ./assorted/2010/12</div>
</li>
</ol>
</div>
<p>Please, use at your own risk. It should work on Windows also, but I have not tested it.</p>
<p>Enjoy!</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>September 9, 2009 -- <a href="http://dev.enekoalonso.com/2009/09/09/crawling-sitemaps-with-python/" title="Crawling sitemaps with Python">Crawling sitemaps with Python</a> (0)</li><li>October 12, 2011 -- <a href="http://dev.enekoalonso.com/2011/10/12/command-line-scripting-with-node-js/" title="Command line scripting with Node.js">Command line scripting with Node.js</a> (0)</li><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Little tricks: repeating strings in Javascript &amp; Python</title>
		<link>http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/</link>
		<comments>http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/#comments</comments>
		<pubDate>Wed, 18 Aug 2010 19:17:34 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[concatenate]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[repeat]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=641</guid>
		<description><![CDATA[How many times have you found yourself printing strings like &#8220;&#8212;&#8212;&#8212;&#8212;-&#8221; or &#8220;===========&#8221;? I do that a lot when I have to do console.logs or if I&#8217;m working on a console application or script. Adding dividers to the output makes it more readable. Python has a very peculiar syntax for repeating strings, which consists in [...]]]></description>
			<content:encoded><![CDATA[<p>How many times have you found yourself printing strings like &#8220;&#8212;&#8212;&#8212;&#8212;-&#8221; or &#8220;===========&#8221;? I do that a lot when I have to do console.logs or if I&#8217;m working on a console application or script. Adding dividers to the output makes it more readable.</p>
<p>Python has a very peculiar syntax for repeating strings, which consists in just multiplying the string by a number, like this:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="st0">&quot;123&quot;</span><span class="sy0">*</span><span class="nu0">4</span> // returns <span class="st0">&quot;123123123123&quot;</span></div>
</li>
</ol>
</div>
<p>We can achieve the same in Javascript using Array.join() like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">Array<span class="br0">&#40;</span><span class="nu0">4</span><span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">&quot;123&quot;</span><span class="br0">&#41;</span>; <span class="co1">// returns &quot;123123123123&quot;</span></div>
</li>
<li class="li1">
<div class="de1">Array<span class="br0">&#40;</span><span class="nu0">30</span><span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">&quot;-&quot;</span><span class="br0">&#41;</span>; <span class="co1">// returns &quot;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">Array<span class="br0">&#40;</span><span class="nu0">2</span><span class="br0">&#41;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">&quot;&lt;span&gt;test&lt;/span&gt;&quot;</span><span class="br0">&#41;</span>; <span class="co1">// returns &quot;&lt;span&gt;test&lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&quot;</span></div>
</li>
</ol>
</div>
<p>Very useful for logs or to generate repeated html strings, etc.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>August 12, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/12/little-tricks-concatenating-arrays-in-javascript/" title="Little tricks: concatenating arrays in Javascript">Little tricks: concatenating arrays in Javascript</a> (4)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (3)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Little tricks: editing strings by index in Javascript and Python</title>
		<link>http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/</link>
		<comments>http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 16:57:04 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[index]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[readonly]]></category>
		<category><![CDATA[string]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=591</guid>
		<description><![CDATA[Editing strings by index maybe something that we don&#8217;t do all the time. But it&#8217;s one of these things that, coming from languages like C, one would assume is as trivial as assigning the value of an indexed position. Something like this: var a = &#34;hello world&#34; a&#91;0&#93; = &#34;H&#34; console.log&#40;a&#41; // outputs &#34;hello world&#34; [...]]]></description>
			<content:encoded><![CDATA[<p>Editing strings by index maybe something that we don&#8217;t do all the time. But it&#8217;s one of these things that, coming from languages like C, one would assume is as trivial as assigning the value of an indexed position. Something like this:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1">a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span> <span class="co1">// outputs &quot;hello world&quot;</span></div>
</li>
</ol>
</div>
<p>Go ahead and paste that code in your favorite javascript console. You would expect the output to be &#8220;Hello there&#8221;, but it is not.<br />
Same goes with Python, check this code:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1">Traceback <span class="br0">&#40;</span>most recent call last<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; File <span class="st0">&quot;&lt;stdin&gt;&quot;</span>, line <span class="nu0">1</span>, <span class="kw1">in</span> <span class="sy0">&lt;</span>module<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">TypeError</span>: <span class="st0">&#39;str&#39;</span> <span class="kw2">object</span> does <span class="kw1">not</span> support item assignment</div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&#39;H&#39;</span></div>
</li>
<li class="li1">
<div class="de1">Traceback <span class="br0">&#40;</span>most recent call last<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; File <span class="st0">&quot;&lt;stdin&gt;&quot;</span>, line <span class="nu0">1</span>, <span class="kw1">in</span> <span class="sy0">&lt;</span>module<span class="sy0">&gt;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw2">TypeError</span>: <span class="st0">&#39;str&#39;</span> <span class="kw2">object</span> does <span class="kw1">not</span> support item assignment</div>
</li>
</ol>
</div>
<p>This is because strings are read only and cannot be modified at all. Only replaced with new strings.</p>
<h2>The solution: convert to array and back to string</h2>
<p>There may be other solutions out there, I&#8217;m sure, but this is the solution I use: Both in Python and Javascript, a string can be converted into an array or list of characters (actually, list of strings). Then we can modify values by index and finally join the output into a new string.</p>
<p>Javascript:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1"><span class="kw2">var</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1">a = a.<span class="me1">split</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1">a = a.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">&quot;&quot;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">console.<span class="me1">log</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span> <span class="co1">// outputs &quot;Hello world&quot;</span></div>
</li>
</ol>
</div>
<p>Python:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="st0">&quot;hello world&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="kw2">list</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a<span class="br0">&#91;</span><span class="nu0">0</span><span class="br0">&#93;</span> = <span class="st0">&quot;H&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a = <span class="st0">&quot;&quot;</span>.<span class="me1">join</span><span class="br0">&#40;</span>a<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="sy0">&gt;&gt;&gt;</span> a</div>
</li>
<li class="li1">
<div class="de1"><span class="st0">&#39;Hello world&#39;</span></div>
</li>
</ol>
</div>
<p>It&#8217;s interesting to see how the syntax for joining arrays into strings is totally the opposite in Javascript and Python. In Javascript, <a href="https://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objects#Array_Methods">join()</a> is a function of the Array object while in Python <a href="http://docs.python.org/py3k/library/stdtypes.html?highlight=join#str.join">join()</a> is a function of the string class.</p>
<p>In the other hand, <a href="https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/split">split()</a> is a method of the String object in Javascript. There is a <a href="http://docs.python.org/py3k/library/stdtypes.html?highlight=split#str.split">split()</a> function on the string class in Python, but it cannot be used to split strings without a specific separator. The <a href="http://docs.python.org/py3k/library/functions.html?highlight=list#list">list()</a> function/constructor does the trick.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li><li>July 20, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/20/little-tricks-string-padding-in-javascript/" title="Little tricks: string padding in Javascript">Little tricks: string padding in Javascript</a> (3)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li><li>September 2, 2009 -- <a href="http://dev.enekoalonso.com/2009/09/02/creating-html-blocks-with-mootools/" title="Creating HTML blocks with Mootools">Creating HTML blocks with Mootools</a> (4)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>More WebSockets, now with Python!</title>
		<link>http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/</link>
		<comments>http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/#comments</comments>
		<pubDate>Sun, 23 May 2010 06:41:27 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[demo]]></category>
		<category><![CDATA[html5]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[test]]></category>
		<category><![CDATA[websocket]]></category>
		<category><![CDATA[websockets]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=576</guid>
		<description><![CDATA[A couple of weeks ago, Tim and I worked on a little game/demo using WebSockets and C# (I haven&#8217;t been able to put it online since I do not have a Windows server). It was a lot of fun and we were able to see the potential of WebSockets and how much internet can will [...]]]></description>
			<content:encoded><![CDATA[<p>A couple of weeks ago, <a href="http://twitter.com/SkullDuggerT">Tim</a> and I worked on a <a href="http://dev.enekoalonso.com/2010/05/03/playing-with-websockets/">little game/demo using WebSockets and C#</a> (I haven&#8217;t been able to put it online since I do not have a Windows server). It was a lot of fun and we were able to see the potential of WebSockets and how much internet <del datetime="2010-05-23T06:09:54+00:00">can</del> will change in the next few years because of them.</p>
<p>Today I spent a couple of hours researching and implementing a WebSocket solution that I could run in my linux servers, and I found this very nice tutorial for creating a Python WebSockets server: <a href="http://yz.mit.edu/wp/web-sockets-tutorial-with-simple-python-server/">http://yz.mit.edu/wp/web-sockets-tutorial-with-simple-python-server/</a></p>
<p>So I took that code and modified to create a very, very basic chat, that broadcasts received messages to all connected clients. You can try it here (as long as the python server is still up): <a href="http://enekoalonso.com/research/html5/websockets/python/">http://enekoalonso.com/research/html5/websockets/python/</a></p>
<p>Here is the client code:</p>
<div class="geshi no javascript">
<ol>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> form = document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#39;form&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> msg = document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#39;msg&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> output = document.<span class="me1">getElementById</span><span class="br0">&#40;</span><span class="st0">&#39;serveroutput&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">var</span> s = <span class="kw2">new</span> WebSocket<span class="br0">&#40;</span><span class="st0">&quot;ws://&quot;</span>+window.<span class="me1">location</span>.<span class="me1">hostname</span>+<span class="st0">&quot;:9876/&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">onopen</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;opened&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; out<span class="br0">&#40;</span><span class="st0">&#39;Connected.&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">onclose</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;closed&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; out<span class="br0">&#40;</span><span class="st0">&#39;Connection closed.&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">onmessage</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; console.<span class="me1">log</span><span class="br0">&#40;</span><span class="st0">&quot;got: &quot;</span> + e.<span class="me1">data</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; out<span class="br0">&#40;</span>e.<span class="me1">data</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;form.<span class="me1">onsubmit</span> = <span class="kw2">function</span><span class="br0">&#40;</span>e<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; e.<span class="me1">preventDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; msg.<span class="me1">value</span> = <span class="st0">&#39;&#39;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; window.<span class="me1">scrollTop</span> = window.<span class="me1">scrollHeight</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> sendMsg<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; s.<span class="me1">send</span><span class="br0">&#40;</span>msg.<span class="me1">value</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw2">function</span> out<span class="br0">&#40;</span>text<span class="br0">&#41;</span> <span class="br0">&#123;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw2">var</span> el = document.<span class="me1">createElement</span><span class="br0">&#40;</span><span class="st0">&#39;p&#39;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; el.<span class="me1">innerHTML</span> = text;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; output.<span class="me1">appendChild</span><span class="br0">&#40;</span>el<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="br0">&#125;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;msg.<span class="kw3">focus</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>And the server code:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">import</span> <span class="kw3">socket</span>, <span class="kw3">threading</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># httphost = &quot;localhost:8888&quot;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># sockethost = &quot;localhost:9876&quot;</span></div>
</li>
<li class="li1">
<div class="de1">httphost = <span class="st0">&quot;enekoalonso.com&quot;</span></div>
</li>
<li class="li1">
<div class="de1">sockethost = <span class="st0">&quot;enekoalonso.com:9876&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> handle<span class="br0">&#40;</span>s, addr<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; handsake = <span class="st0">&quot;HTTP/1.1 101 Web Socket Protocol Handshake<span class="es0">\r</span><span class="es0">\n</span>Upgrade: WebSocket<span class="es0">\r</span><span class="es0">\n</span>Connection: Upgrade<span class="es0">\r</span><span class="es0">\n</span>WebSocket-Origin: http://%s<span class="es0">\r</span><span class="es0">\n</span>WebSocket-Location: ws://%s/<span class="es0">\r</span><span class="es0">\n</span>WebSocket-Protocol: sample<span class="es0">\r</span><span class="es0">\n</span><span class="es0">\r</span><span class="es0">\n</span>&quot;</span> <span class="sy0">%</span> <span class="br0">&#40;</span>httphost, sockethost<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; s.<span class="me1">send</span><span class="br0">&#40;</span>handsake<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; data = s.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; lock = <span class="kw3">threading</span>.<span class="me1">Lock</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">while</span> <span class="nu0">1</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; data = s.<span class="me1">recv</span><span class="br0">&#40;</span><span class="nu0">1024</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw1">not</span> data: <span class="kw1">break</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&#39;Data from&#39;</span>, addr, <span class="st0">&#39;:&#39;</span>, data</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; lock.<span class="me1">acquire</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="br0">&#91;</span>conn.<span class="me1">send</span><span class="br0">&#40;</span>data<span class="br0">&#41;</span> <span class="kw1">for</span> conn <span class="kw1">in</span> clients<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; lock.<span class="me1">release</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> <span class="st0">&#39;Client closed:&#39;</span>, addr</div>
</li>
<li class="li1">
<div class="de1">&nbsp; lock.<span class="me1">acquire</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; clients.<span class="me1">remove</span><span class="br0">&#40;</span>s<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; lock.<span class="me1">release</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; s.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> start_server<span class="br0">&#40;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp;s = <span class="kw3">socket</span>.<span class="kw3">socket</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">setsockopt</span><span class="br0">&#40;</span><span class="kw3">socket</span>.<span class="me1">SOL_SOCKET</span>, <span class="kw3">socket</span>.<span class="me1">SO_REUSEADDR</span>, <span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">bind</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="st0">&#39;&#39;</span>, <span class="nu0">9876</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;s.<span class="me1">listen</span><span class="br0">&#40;</span><span class="nu0">1</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;<span class="kw1">while</span> <span class="nu0">1</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;conn, addr = s.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">print</span> <span class="st0">&#39;Connected by&#39;</span>, addr</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;clients.<span class="me1">append</span><span class="br0">&#40;</span>conn<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">threading</span>.<span class="me1">Thread</span><span class="br0">&#40;</span>target = handle, args = <span class="br0">&#40;</span>conn,addr<span class="br0">&#41;</span><span class="br0">&#41;</span>.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">clients = <span class="br0">&#91;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">start_server<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Check the live demo (be aware WebSockets are only supported by Google Chrome right now): <a href="http://enekoalonso.com/research/html5/websockets/python/">http://enekoalonso.com/research/html5/websockets/python/</a><br />
Open a few tabs and send some text. You should see it appearing in all of them. It will also work if you open the page in multiple browser windows or even if you open the page in different computers.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>May 3, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/03/playing-with-websockets/" title="Playing with WebSockets">Playing with WebSockets</a> (4)</li><li>May 6, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/06/tech-talks-at-level-studios/" title="Tech talks at LEVEL Studios">Tech talks at LEVEL Studios</a> (0)</li><li>February 19, 2010 -- <a href="http://dev.enekoalonso.com/2010/02/19/having-fun-with-mooml-and-twitter/" title="Having fun with Mooml &#038; Twitter">Having fun with Mooml &#038; Twitter</a> (0)</li><li>May 18, 2011 -- <a href="http://dev.enekoalonso.com/2011/05/18/location-hash-is-dead-on-html5-browsers/" title="location.hash is dead (on html5 browsers)">location.hash is dead (on html5 browsers)</a> (0)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Crawling sitemaps with Python</title>
		<link>http://dev.enekoalonso.com/2009/09/09/crawling-sitemaps-with-python/</link>
		<comments>http://dev.enekoalonso.com/2009/09/09/crawling-sitemaps-with-python/#comments</comments>
		<pubDate>Wed, 09 Sep 2009 21:59:08 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[crawl]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[request]]></category>
		<category><![CDATA[script]]></category>
		<category><![CDATA[sitemap]]></category>
		<category><![CDATA[url]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=379</guid>
		<description><![CDATA[This a basic script I have created to crawl an xml sitemap file (does not support nested sitemaps). It will report if the request was successfully processed by the server or if, instead, it returned some kind of error. #!/usr/bin/env python from sys import argv from re import findall from socket import setdefaulttimeout from urllib2 [...]]]></description>
			<content:encoded><![CDATA[<p>This a basic script I have created to crawl an xml sitemap file (does not support nested sitemaps). It will report if the request was successfully processed by the server or if, instead, it returned some kind of error.</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">sys</span> <span class="kw1">import</span> argv</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">re</span> <span class="kw1">import</span> findall</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">socket</span> <span class="kw1">import</span> setdefaulttimeout</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">urllib2</span> <span class="kw1">import</span> Request, urlopen</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">from</span> <span class="kw3">datetime</span> <span class="kw1">import</span> <span class="kw3">datetime</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># Initialization</span></div>
</li>
<li class="li1">
<div class="de1">procId = argv<span class="br0">&#91;</span><span class="nu0">2</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">sitemapUrl = argv<span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="st0">&#39;[%s]&#39;</span><span class="sy0">%</span>procId, <span class="st0">&quot;Crawling sitemap:&quot;</span>, sitemapUrl</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># Test url</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> testURL<span class="br0">&#40;</span>url<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; start = <span class="kw3">datetime</span>.<span class="me1">now</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; msg = <span class="st0">&#39;&#39;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw3">code</span> = <span class="nu0">-1</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; req &nbsp;= Request<span class="br0">&#40;</span>url<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">try</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; response = urlopen<span class="br0">&#40;</span>req<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw3">code</span> = response.<span class="kw3">code</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">except</span> <span class="kw2">IOError</span>, e:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">hasattr</span><span class="br0">&#40;</span>e, <span class="st0">&#39;reason&#39;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; msg = <span class="st0">&#39;[Error: %s]&#39;</span> <span class="sy0">%</span> e.<span class="me1">reason</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">elif</span> <span class="kw2">hasattr</span><span class="br0">&#40;</span>e, <span class="st0">&#39;code&#39;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; msg = <span class="st0">&#39;[Error: %s]&#39;</span> <span class="sy0">%</span> e.<span class="kw3">code</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; delta = <span class="kw3">datetime</span>.<span class="me1">now</span><span class="br0">&#40;</span><span class="br0">&#41;</span> &#8211; start</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> <span class="st0">&#39;[%02s]&#39;</span><span class="sy0">%</span>procId, <span class="st0">&#39;[%d]&#39;</span><span class="sy0">%</span><span class="kw3">code</span>, <span class="st0">&#39;[%03dms]&#39;</span><span class="sy0">%</span><span class="br0">&#40;</span>delta.<span class="me1">microseconds</span>/<span class="nu0">1000</span><span class="br0">&#41;</span>, msg, <span class="st0">&#39;&gt;&gt;&#39;</span>, url</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="co1"># Load sitemap and process</span></div>
</li>
<li class="li1">
<div class="de1">req = Request<span class="br0">&#40;</span>sitemapUrl<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">htmlSource = urlopen<span class="br0">&#40;</span>req<span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">linksList = findall<span class="br0">&#40;</span><span class="st0">&#39;&lt;loc&gt;(.*?)&lt;/loc&gt;&#39;</span>, htmlSource<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="kw2">len</span><span class="br0">&#40;</span>linksList<span class="br0">&#41;</span>, <span class="st0">&quot;links found.&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> link <span class="kw1">in</span> linksList:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; testURL<span class="br0">&#40;</span>link<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The script expects 2 parameters, the url for the xml sitemap and a identifier that will be printed to the log.</p>
<p> It is not very fast, but you can easily run multiple instances from the command line:</p>
<div class="geshi no bash">
<ol>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>sitemap_crawler.py http:<span class="sy0">//</span>example.com<span class="sy0">/</span>sitemap.xml <span class="nu0">1</span> <span class="sy0">&amp;</span></div>
</li>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>sitemap_crawler.py http:<span class="sy0">//</span>example.com<span class="sy0">/</span>sitemap.xml <span class="nu0">2</span> <span class="sy0">&amp;</span></div>
</li>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>sitemap_crawler.py http:<span class="sy0">//</span>example.com<span class="sy0">/</span>sitemap.xml <span class="nu0">3</span> <span class="sy0">&amp;</span></div>
</li>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>sitemap_crawler.py http:<span class="sy0">//</span>example.com<span class="sy0">/</span>sitemap.xml <span class="nu0">4</span> <span class="sy0">&amp;</span></div>
</li>
<li class="li1">
<div class="de1">.<span class="sy0">/</span>sitemap_crawler.py http:<span class="sy0">//</span>example.com<span class="sy0">/</span>sitemap.xml <span class="nu0">5</span> <span class="sy0">&amp;</span></div>
</li>
</ol>
</div>
<p>Enjoy!</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>August 6, 2011 -- <a href="http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/" title="Python script: remove empty folders">Python script: remove empty folders</a> (1)</li><li>October 12, 2011 -- <a href="http://dev.enekoalonso.com/2011/10/12/command-line-scripting-with-node-js/" title="Command line scripting with Node.js">Command line scripting with Node.js</a> (0)</li><li>May 18, 2011 -- <a href="http://dev.enekoalonso.com/2011/05/18/location-hash-is-dead-on-html5-browsers/" title="location.hash is dead (on html5 browsers)">location.hash is dead (on html5 browsers)</a> (0)</li><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2009/09/09/crawling-sitemaps-with-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>I&#8217;m ready for some fun with Python 3.0</title>
		<link>http://dev.enekoalonso.com/2008/12/06/im-ready-for-some-fun-with-python-30/</link>
		<comments>http://dev.enekoalonso.com/2008/12/06/im-ready-for-some-fun-with-python-30/#comments</comments>
		<pubDate>Sun, 07 Dec 2008 00:55:10 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[python-3k]]></category>
		<category><![CDATA[python3]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=93</guid>
		<description><![CDATA[I just found out Python 3.0/3k has been finally released. This is very good news :) Let&#8217;s find out how to install it on Mac OS X Leopard. Related Posts:August 6, 2011 -- Python script: remove empty folders (1)August 18, 2010 -- Little tricks: repeating strings in Javascript &#038; Python (1)July 1, 2010 -- Little [...]]]></description>
			<content:encoded><![CDATA[<p>I just found out <a href="http://ifacethoughts.net/2008/12/04/python-30-is-out/">Python 3.0/3k has been finally released</a>. This is very good news :) Let&#8217;s find out how to install it on Mac OS X Leopard.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>August 6, 2011 -- <a href="http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/" title="Python script: remove empty folders">Python script: remove empty folders</a> (1)</li><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2008/12/06/im-ready-for-some-fun-with-python-30/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Making your objects sortable</title>
		<link>http://dev.enekoalonso.com/2008/11/28/making-your-objects-sortable/</link>
		<comments>http://dev.enekoalonso.com/2008/11/28/making-your-objects-sortable/#comments</comments>
		<pubDate>Sat, 29 Nov 2008 07:44:12 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=44</guid>
		<description><![CDATA[Making your objects sortable in Python is very simple: add the __cmp__ function and the logic to compare the two objects and you are done! class person: &#160; def __init__&#40;self, name, age&#41;: &#160; &#160; self.name = name &#160; &#160; self.age = age &#160; &#160; def __str__&#40;self&#41;: &#160; &#160; return &#39;Person %s (%d)&#39; % &#40;self.name, self.age&#41; [...]]]></description>
			<content:encoded><![CDATA[<p>Making your objects sortable in Python is very simple: add the __cmp__ function and the logic to compare the two objects and you are done!</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">class</span> person:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, name, age<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">name</span> = name</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">age</span> = age</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> <span class="kw4">__str__</span><span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#39;Person %s (%d)&#39;</span> <span class="sy0">%</span> <span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">name</span>, <span class="kw2">self</span>.<span class="me1">age</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> <span class="kw4">__cmp__</span><span class="br0">&#40;</span><span class="kw2">self</span>, other<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">cmp</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">name</span>+<span class="kw2">str</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">age</span><span class="br0">&#41;</span>, other.<span class="me1">name</span>+<span class="kw2">str</span><span class="br0">&#40;</span>other.<span class="me1">age</span><span class="br0">&#41;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">lista = <span class="br0">&#91;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; person<span class="br0">&#40;</span><span class="st0">&#39;Ren Smith&#39;</span>, <span class="nu0">24</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; person<span class="br0">&#40;</span><span class="st0">&#39;Aohn Doe&#39;</span>, <span class="nu0">31</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; person<span class="br0">&#40;</span><span class="st0">&#39;Aohn Doe&#39;</span>, <span class="nu0">22</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; person<span class="br0">&#40;</span><span class="st0">&#39;Eneko Alonso&#39;</span>, <span class="nu0">30</span><span class="br0">&#41;</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; person<span class="br0">&#40;</span><span class="st0">&#39;Ren Gomas&#39;</span>, <span class="nu0">34</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> person <span class="kw1">in</span> lista:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> person</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">print</span> <span class="st0">&#39;&#8212;&#8211;&#39;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> person <span class="kw1">in</span> <span class="kw2">sorted</span><span class="br0">&#40;</span>lista<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> person</div>
</li>
</ol>
</div>
<p>As you can see, you can totally customize your __cmp__ method and compare any class members.</p>
<p>Download the code: <a href="http://enekoalonso.com/svn/python/classes/sorting-objects.py">http://enekoalonso.com/svn/python/classes/sorting-objects.py</a></p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>August 6, 2011 -- <a href="http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/" title="Python script: remove empty folders">Python script: remove empty folders</a> (1)</li><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2008/11/28/making-your-objects-sortable/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Copying objects vs. copying references</title>
		<link>http://dev.enekoalonso.com/2008/11/26/copying-objects-vs-copying-references/</link>
		<comments>http://dev.enekoalonso.com/2008/11/26/copying-objects-vs-copying-references/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 07:16:14 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=14</guid>
		<description><![CDATA[C++ is a language that allows creation of static instances of objects, this is without using pointers. This is why copy-constructors are needed, since it is common to copy or clone objects. Other languages like Delphi don&#8217;t allow to create static variables to instantiate objects. Instead, all objects are pointers. So in C++, assignments of [...]]]></description>
			<content:encoded><![CDATA[<p>C++ is a language that allows creation of static instances of objects, this is without using pointers. This is why <a href="http://en.wikipedia.org/wiki/Copy_constructor">copy-constructors</a> are needed, since it is common to copy or clone objects. Other languages like Delphi don&#8217;t allow to create static variables to instantiate objects. Instead, all objects are pointers. So in C++, assignments of instances of the same class create a copy of the object, while in Delphi, only the reference to the second instance is copied.</p>
<p>When I started learning Python one year ago, I wanted to know if objects were cloned on assignments or if only the reference to the object was assigned instead. Here is how I found it:</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="kw1">class</span> Item<span class="br0">&#40;</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span> <span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">text</span> = <span class="st0">&quot;&quot;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">def</span> sayIt<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">print</span> <span class="kw2">self</span>.<span class="me1">text</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">A = Item<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">B = Item<span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">A.<span class="me1">text</span> = <span class="st0">&quot;testing A&quot;</span></div>
</li>
<li class="li1">
<div class="de1">B.<span class="me1">text</span> = <span class="st0">&quot;testing B&quot;</span></div>
</li>
<li class="li1">
<div class="de1">A.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">B.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">A = B</div>
</li>
<li class="li1">
<div class="de1">A.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">B.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">A.<span class="me1">text</span> = <span class="st0">&quot;testing A 2&quot;</span></div>
</li>
<li class="li1">
<div class="de1">A.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">B.<span class="me1">sayIt</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>This code will output 6 messages. The first two will be obviously different, since A and B are to separate instances on memory. When B is assigned to A, two things can happen. B is cloned and A is a new instance equal to B or the reference to B is assigned to A so A and B become the same instance in memory (B). No matter which one happens, both messages after the assignment will correspond to the B instance (&#8220;testing B&#8221;).</p>
<p>But what will happen when we modify A again? Will B be also modified?</p>
<p>Here is the output:</p>
<pre>
testing A
testing B
testing B
testing B
testing A 2
testing A 2
</pre>
<p>So A and B are now the same object in memory.</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>August 6, 2011 -- <a href="http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/" title="Python script: remove empty folders">Python script: remove empty folders</a> (1)</li><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2008/11/26/copying-objects-vs-copying-references/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fibonacci</title>
		<link>http://dev.enekoalonso.com/2008/11/26/fibonacci/</link>
		<comments>http://dev.enekoalonso.com/2008/11/26/fibonacci/#comments</comments>
		<pubDate>Thu, 27 Nov 2008 06:08:10 +0000</pubDate>
		<dc:creator>Eneko Alonso</dc:creator>
				<category><![CDATA[uncategorized]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://dev.enekoalonso.com/?p=7</guid>
		<description><![CDATA[Fibonacci is a fast growing sequence that can easily overflow your integer variables. Fortunately, Python doesn&#8217;t have this problem, since it can handle huge integer numbers. #!/usr/bin/env python def fib&#40;n&#41;: &#160; if n==0 or n==1: &#160; &#160; ret = n &#160; else: &#160; &#160; ret = fib&#40;n-1&#41; + fib&#40;n-2&#41; &#160; return ret &#160; for i [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.enekoalonso.com/python/fibonacci.py">Fibonacci</a> is a fast growing sequence that can easily overflow your integer variables. Fortunately, Python doesn&#8217;t have this problem, since it can handle huge integer numbers.</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> fib<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> n==<span class="nu0">0</span> <span class="kw1">or</span> n==<span class="nu0">1</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = n</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = fib<span class="br0">&#40;</span>n<span class="nu0">-1</span><span class="br0">&#41;</span> + fib<span class="br0">&#40;</span>n<span class="nu0">-2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> ret</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1000</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> fib<span class="br0">&#40;</span>i<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>The example avobe has a big performance issue, due to the recursive calls to calculate n-1 and n-2 values, which are calculated multiple times over and over. By storing the results on a list we solve this issue, although we now relay on the amount of available memory.</p>
<div class="geshi no python">
<ol>
<li class="li1">
<div class="de1"><span class="co1">#!/usr/bin/env python</span></div>
</li>
<li class="li1">
<div class="de1">fibs = <span class="br0">&#91;</span><span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">def</span> fib<span class="br0">&#40;</span>n<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">if</span> n==<span class="nu0">0</span> <span class="kw1">or</span> n==<span class="nu0">1</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = n</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">elif</span> n <span class="sy0">&lt;</span> <span class="kw2">len</span><span class="br0">&#40;</span>fibs<span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = fibs<span class="br0">&#91;</span>n<span class="br0">&#93;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">else</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; ret = fib<span class="br0">&#40;</span>n<span class="nu0">-1</span><span class="br0">&#41;</span> + fib<span class="br0">&#40;</span>n<span class="nu0">-2</span><span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; fibs.<span class="me1">append</span><span class="br0">&#40;</span>ret<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">return</span> ret</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">for</span> i <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">1000</span><span class="br0">&#41;</span>:</div>
</li>
<li class="li1">
<div class="de1">&nbsp; <span class="kw1">print</span> fib<span class="br0">&#40;</span>i<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>Thus, Fib(1000) = 43,466,557,686,937,456,435,688,527,675,040,625,802,<br />
564,660,517,371,780,402,481,729,089,536,555,417,949,051,890,403,879,840,079,<br />
255,169,295,922,593,080,322,634,775,209,689,623,239,873,322,471,161,642,996,<br />
440,906,533,187,938,298,969,649,928,516,003,704,476,137,795,166,849,228,875</p>
<h3  class="related_post_title">Related Posts:</h3><ul class="related_post"><li>August 6, 2011 -- <a href="http://dev.enekoalonso.com/2011/08/06/python-script-remove-empty-folders/" title="Python script: remove empty folders">Python script: remove empty folders</a> (1)</li><li>August 18, 2010 -- <a href="http://dev.enekoalonso.com/2010/08/18/little-tricks-repeating-strings-in-javascript-python/" title="Little tricks: repeating strings in Javascript &#038; Python">Little tricks: repeating strings in Javascript &#038; Python</a> (1)</li><li>July 1, 2010 -- <a href="http://dev.enekoalonso.com/2010/07/01/little-tricks-editing-strings-by-index-in-javascript-and-python/" title="Little tricks: editing strings by index in Javascript and Python">Little tricks: editing strings by index in Javascript and Python</a> (1)</li><li>May 22, 2010 -- <a href="http://dev.enekoalonso.com/2010/05/22/more-websockets-now-with-python/" title="More WebSockets, now with Python!">More WebSockets, now with Python!</a> (9)</li></ul>]]></content:encoded>
			<wfw:commentRss>http://dev.enekoalonso.com/2008/11/26/fibonacci/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

