<span class="Apple-style-span" style="font-family: Times; font-size: 16px; "><div style="margin-top: 8px; margin-right: 8px; margin-bottom: 8px; margin-left: 8px; font: normal normal normal small/normal arial; ">I&#39;m just getting ready to start the semester using my new book (Python Programming in Context) and noticed that I somehow missed all the changes to urllib in python 3.0. &nbsp;ARGH to say the least. &nbsp;I like using urllib in the intro class because we can get data from places that are more interesting/motivating/relevant to the students.<div>
<br><div>Here are some of my observations on trying to do very basic stuff with urllib:</div><div><br></div><div>1. &nbsp;urllib.urlopen &nbsp;is now urllib.request.urlopen</div><div>2. &nbsp;The object returned by urlopen is no longer iterable! &nbsp;no more for line in url.</div>
<div>3. &nbsp;read, readline, readlines now return bytes objects or arrays of bytes instead of a str and array of str</div><div>4. &nbsp;Taking the naive approach to converting a bytes object to a str does not work as you would expect.<br clear="all">
<br></div><div><div>&gt;&gt;&gt; import urllib.request</div><div>&gt;&gt;&gt; page = urllib.request.urlopen(&#39;<a href="http://knuth.luther.edu/test.html">http://knuth.luther.edu/test.html</a>&#39;)</div><div>&gt;&gt;&gt; page</div>
<div>&lt;addinfourl at 16419792 whose fp = &lt;socket.SocketIO object at 0xfa8570&gt;&gt;</div><div>&gt;&gt;&gt; line = page.readline()</div><div>&gt;&gt;&gt; line</div><div>b&#39;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;\n&#39;</div>
<div>&gt;&gt;&gt; str(line)</div><div>&#39;b\&#39;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;\\n\&#39;&#39;</div><div>&gt;&gt;&gt;&nbsp;</div><div><br></div><div>As you can see from the example the &#39;b&#39; becomes part of the string! &nbsp;It seems like this should be a bug, is it?</div>
<div><br></div><div><br></div><div>Here&#39;s the iteration problem:</div><div><div>&#39;b\&#39;&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD HTML 4.01 Transitional//EN&quot;\\n\&#39;&#39;</div><div>&gt;&gt;&gt; for line in page:</div>
<div><span class="Apple-tab-span" style="white-space: pre; ">        </span>print(line)</div><div><br></div><div>Traceback (most recent call last):</div><div>&nbsp;&nbsp;File &quot;&lt;pyshell#10&gt;&quot;, line 1, in &lt;module&gt;</div>
<div>&nbsp;&nbsp; &nbsp;for line in page:</div><div>TypeError: &#39;addinfourl&#39; object is not iterable</div><div><br></div><div>Why is this not iterable anymore? &nbsp;Is this too a bug? &nbsp;What the heck is an addinfourl object?</div><div>
<br></div><div><br></div><div>5. &nbsp;Finally, I see that a bytes object has some of the same methods as strings. &nbsp;But the error messages are confusing.</div><div><br></div><div><div>&gt;&gt;&gt; line</div><div>b&#39; &nbsp; &quot;<a href="http://www.w3.org/TR/html4/loose.dtd">http://www.w3.org/TR/html4/loose.dtd</a>&quot;&gt;\n&#39;</div>
<div>&gt;&gt;&gt; line.find(&#39;www&#39;)</div><div>Traceback (most recent call last):</div><div>&nbsp;&nbsp;File &quot;&lt;pyshell#18&gt;&quot;, line 1, in &lt;module&gt;</div><div>&nbsp;&nbsp; &nbsp;line.find(&#39;www&#39;)</div><div>TypeError: expected an object with the buffer interface</div>
<div>&gt;&gt;&gt; line.find(b&#39;www&#39;)</div><div>11</div><div><br></div><div>Why couldn&#39;t find take string as a parameter?</div><div><br></div><div>If folks have advice on which, if any, of these are bugs please let me know and I&#39;ll file them, and if possible work on fixes for them too.</div>
<div><br></div><div>If you have advice on how I should better be teaching this new urllib that would be great to hear as well.<br></div><div><br></div><div><br></div><div>Thanks,</div><div><br></div><div>Brad</div><div><br>
</div></div></div>--&nbsp;<br>Brad Miller<br>Assistant Professor, Computer Science<br>Luther College</div></div></div></span><br>-- <br>Brad Miller<br>Assistant Professor, Computer Science<br>Luther College<br>