<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.linuxformat.ru/wiki/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF120%3APython</id>
		<title>LXF120:Python - История изменений</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.linuxformat.ru/wiki/index.php?action=history&amp;feed=atom&amp;title=LXF120%3APython"/>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;action=history"/>
		<updated>2026-05-13T03:02:41Z</updated>
		<subtitle>История изменений этой страницы в вики</subtitle>
		<generator>MediaWiki 1.19.20+dfsg-0+deb7u3</generator>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=15109&amp;oldid=prev</id>
		<title>2sash-kan: /* Регулярные выражения */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=15109&amp;oldid=prev"/>
				<updated>2014-07-03T17:14:42Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Регулярные выражения&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 17:14, 3 июля 2014&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 108:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 108:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;От регулярных выражений (также известных как «регекспы» [regex]) никуда не денешься – они будут все чаще встречаться на вашем пути переустройства мира. Регулярные выражения – это просто способ выполнения поиска и замены, и хотя они смахивают на криптограммы, разобраться в них не так уж трудно. В данном случае нам надо всего лишь избавиться от нудных HTML-тэгов. Мы, вероятно, и без того извлекли бы нужные данные, но подобный опыт пригодится нам в будущем, если мы захотим приспособить наш скрипт к работе с различными источниками.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;От регулярных выражений (также известных как «регекспы» [regex]) никуда не денешься – они будут все чаще встречаться на вашем пути переустройства мира. Регулярные выражения – это просто способ выполнения поиска и замены, и хотя они смахивают на криптограммы, разобраться в них не так уж трудно. В данном случае нам надо всего лишь избавиться от нудных HTML-тэгов. Мы, вероятно, и без того извлекли бы нужные данные, но подобный опыт пригодится нам в будущем, если мы захотим приспособить наш скрипт к работе с различными источниками.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы импортируем ''Python''-модуль '''re''' (он включен в качестве одной из стандартных библиотек, так что ничего загружать и устанавливать не придется) и привлечем его к работе с этим текстом. На нашем уроке нет места на детальное объяснение работы регулярных выражений, а за краткими сведениями обратитесь ко врезке '''Регулярные выражения''' или статье из [[LXF80:Регулярные_выражения&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;.&lt;/del&gt;|LXF80]].&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Мы импортируем ''Python''-модуль '''re''' (он включен в качестве одной из стандартных библиотек, так что ничего загружать и устанавливать не придется) и привлечем его к работе с этим текстом. На нашем уроке нет места на детальное объяснение работы регулярных выражений, а за краткими сведениями обратитесь ко врезке '''Регулярные выражения''' или статье из [[LXF80:Регулярные_выражения|LXF80]].&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; &amp;#160;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Выражением мы хотим охватить все, что обрамлено знаками «больше» и «меньше», используемыми для обозначения HTML-тэгов. Это очень легко; выражение будет выглядеть как &amp;lt;, за которым следует шаблон любого символа, повторенный любое количество раз, то есть .'''+?''' и в конце '''&amp;gt;'''. '''+?''' – то же, что и '''+''', но это «ленивое» соответствие: оно отвечает наикратчайшей корректной строке. А нам того и надо – все, что находится между '''&amp;lt;&amp;gt;'''; других вариантов нет.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Выражением мы хотим охватить все, что обрамлено знаками «больше» и «меньше», используемыми для обозначения HTML-тэгов. Это очень легко; выражение будет выглядеть как &amp;lt;, за которым следует шаблон любого символа, повторенный любое количество раз, то есть .'''+?''' и в конце '''&amp;gt;'''. '''+?''' – то же, что и '''+''', но это «ленивое» соответствие: оно отвечает наикратчайшей корректной строке. А нам того и надо – все, что находится между '''&amp;lt;&amp;gt;'''; других вариантов нет.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>2sash-kan</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=10718&amp;oldid=prev</id>
		<title>Newacct в 00:43, 13 сентября 2010</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=10718&amp;oldid=prev"/>
				<updated>2010-09-13T00:43:52Z</updated>
		
		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 00:43, 13 сентября 2010&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 158:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 158:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=Python&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;source lang=Python&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; &amp;gt;&amp;gt;&amp;gt; def change_wallpaper(filename):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; &amp;gt;&amp;gt;&amp;gt; def change_wallpaper(filename):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; ... cmd = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;string.join([“gconftool&lt;/del&gt;-2 -s /desktop/gnome/background/picture_filename -t string &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;\””,&lt;/del&gt;filename&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;,”\””],&lt;/del&gt;''&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; ... cmd = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'gconftool&lt;/ins&gt;-2 -s /desktop/gnome/background/picture_filename -t string &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;' + &lt;/ins&gt;filename &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;+ &lt;/ins&gt;'&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;&lt;/ins&gt;'&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; ... os.system(cmd)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; ... os.system(cmd)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; ...&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; ...&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 192:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 192:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; import feedparser,re,os,string&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; import feedparser,re,os,string&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; def change_wallpaper(filename):&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; def change_wallpaper(filename):&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; cmd = &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;string.join([“gconftool&lt;/del&gt;-2 -s /desktop/gnome/&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; cmd = &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;'gconftool&lt;/ins&gt;-2 -s /desktop/gnome/ background/picture_filename -t string &lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;'+&lt;/ins&gt;filename&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;+&lt;/ins&gt;'&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;&amp;quot;&lt;/ins&gt;'&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;del class=&quot;diffchange diffchange-inline&quot;&gt; &lt;/del&gt;background/picture_filename -t string &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;\””,&lt;/del&gt;filename&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;,”\””],&lt;/del&gt;''&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; os.system(cmd)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; os.system(cmd)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; url = “http://weather.yahooapis.com/&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; url = “http://weather.yahooapis.com/&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 201:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 200:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; summary = data.entries[0].summary&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; summary = data.entries[0].summary&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; temp = re.split(r'\n',re.sub('&amp;lt;.+?&amp;gt;','',summary))&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; temp = re.split(r'\n',re.sub('&amp;lt;.+?&amp;gt;','',summary))&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; temp = int(re.&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;findall&lt;/del&gt;('&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[0‑9]&lt;/del&gt;+',temp[2])&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;[0]&lt;/del&gt;)&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; temp = int(re.&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;search&lt;/ins&gt;('&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;\d&lt;/ins&gt;+',temp[2])&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;.group()&lt;/ins&gt;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; if &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;(&lt;/del&gt;temp &amp;lt;0&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; if temp &amp;lt;0:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/freezing.svg')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/freezing.svg')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; elif &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;(&lt;/del&gt;temp&amp;lt;9&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; elif temp&amp;lt;9:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/snow.svg')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/snow.svg')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; elif &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;(&lt;/del&gt;temp&amp;lt;16&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; elif temp&amp;lt;16:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/mild.svg')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/mild.svg')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; elif &lt;del class=&quot;diffchange diffchange-inline&quot;&gt;(&lt;/del&gt;temp&amp;lt;26&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;)&lt;/del&gt;:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; elif temp&amp;lt;26:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/warm.svg')&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160;&amp;#160; change_wallpaper('/home/evilnick/weather/warm.svg')&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; else:&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;#160; else:&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Newacct</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=10362&amp;oldid=prev</id>
		<title>Crazy Rebel: /* Перемена погоды */</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=10362&amp;oldid=prev"/>
				<updated>2010-06-11T07:13:02Z</updated>
		
		<summary type="html">&lt;p&gt;‎&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Перемена погоды&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table class='diff diff-contentalign-left'&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
				&lt;col class='diff-marker' /&gt;
				&lt;col class='diff-content' /&gt;
			&lt;tr valign='top'&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;← Предыдущая&lt;/td&gt;
			&lt;td colspan='2' style=&quot;background-color: white; color:black;&quot;&gt;Версия 07:13, 11 июня 2010&lt;/td&gt;
			&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 214:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 214:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;&amp;lt;/source&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;background: #ffa; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|&lt;del class=&quot;diffchange diffchange-inline&quot;&gt;Загловок&lt;/del&gt;=Форматы web-данных|Содержание=Мы осознали, что есть масса web-приложений, способных доставить нам данные. Но вы ведь не ждали, что все будет просто, не так ли? Протоколов или способов предоставления данных немало, и некоторые сайты (например, Flickr) даже предусматривают более одного варианта. Еще одно неудобство – разнобой в их использовании на сайтах. В нашей серии уроков мы постепенно все это рассмотрим.|Ширина=200px}}&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;background: #cfc; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;{{Врезка|&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;Заголовок&lt;/ins&gt;=Форматы web-данных|Содержание=Мы осознали, что есть масса web-приложений, способных доставить нам данные. Но вы ведь не ждали, что все будет просто, не так ли? Протоколов или способов предоставления данных немало, и некоторые сайты (например, Flickr) даже предусматривают более одного варианта. Еще одно неудобство – разнобой в их использовании на сайтах. В нашей серии уроков мы постепенно все это рассмотрим.|Ширина=200px}}&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Конечно, даже при буйном воображении это не полноценное приложение, а небольшой сценарий, но его вполне можно взять за основу. На данном уроке мы взяли данные из сети и автоматически совместили их с контекстом рабочего стола. Мы увидели, как просто выглядят RSS-ленты и как работать с объектами в ''Python''; постигли ужасы регулярных выражений; и рассмотрели совершение из ''Python'' системных вызовов для выполнения внешних команд. Вот так мы и можем, исследуя сервисы всемирной паутины, брать что угодно и ставить себе на службу.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Конечно, даже при буйном воображении это не полноценное приложение, а небольшой сценарий, но его вполне можно взять за основу. На данном уроке мы взяли данные из сети и автоматически совместили их с контекстом рабочего стола. Мы увидели, как просто выглядят RSS-ленты и как работать с объектами в ''Python''; постигли ужасы регулярных выражений; и рассмотрели совершение из ''Python'' системных вызовов для выполнения внешних команд. Вот так мы и можем, исследуя сервисы всемирной паутины, брать что угодно и ставить себе на службу.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Скрипт легко расширить (например, позволив пользователям выбирать местоположение) или преобразовать его в апплет. Покамест он завершился бы с ошибкой при отсутствии подключения к Интернету, что не есть хорошо, но на следующих уроках мы изучим, как с этим справиться. Оставайтесь с нами! '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;&amp;#160;&lt;/td&gt;&lt;td style=&quot;background: #eee; color:black; font-size: smaller;&quot;&gt;&lt;div&gt;Скрипт легко расширить (например, позволив пользователям выбирать местоположение) или преобразовать его в апплет. Покамест он завершился бы с ошибкой при отсутствии подключения к Интернету, что не есть хорошо, но на следующих уроках мы изучим, как с этим справиться. Оставайтесь с нами! '''LXF'''&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	<entry>
		<id>http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=10356&amp;oldid=prev</id>
		<title>Crazy Rebel: викификация, оформление, иллюстрация</title>
		<link rel="alternate" type="text/html" href="http://wiki.linuxformat.ru/wiki/index.php?title=LXF120:Python&amp;diff=10356&amp;oldid=prev"/>
				<updated>2010-06-11T07:09:52Z</updated>
		
		<summary type="html">&lt;p&gt;викификация, оформление, иллюстрация&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;: '''''Python''''' Заставим Web доставлять нужное содержимое вам на блюдечке&lt;br /&gt;
&lt;br /&gt;
==''Python'': Сеть на ваш вкус==&lt;br /&gt;
&lt;br /&gt;
{{Цикл/Python}}&lt;br /&gt;
&lt;br /&gt;
: '''Часть 1''': Недовольны, что контент раскидан где попало и как попало? '''Ник Вейч''' приступает к объяснению, как подчинить сеть вашим целям.&lt;br /&gt;
&lt;br /&gt;
Что бы вам ни захотелось узнать, оно, вероятно, найдется в Сети. Это загадочное облако – иногда белое и пушистое, а иногда и полное грязных инсинуаций – содержит знания любого сорта, хотя до них надо еще докопаться. Готовы поспорить, что отыщется даже точная дата крещения «Наболиона Буонапарте», если порыться старательно.&lt;br /&gt;
&lt;br /&gt;
Но не вся информация в сети статична, соединена разумным образом или вообще настолько хороша, насколько должно быть. Вот почему одним из заметных шагов пост-web 2.0 является мэшап ['''мэшап, mashup – технология построения web-сайта с объединением возможностей группы сторонних web-приложений, см. http://ru.wikipedia.org/wiki/Мэшап_(веб), – прим. пер.'''] – преобразование web-содержимого в новые удивительные формы. Добро пожаловать в мир панк-данных.&lt;br /&gt;
&lt;br /&gt;
===Куда дует ветер===&lt;br /&gt;
&lt;br /&gt;
Для начала нашего путешествия сделаем что-нибудь попроще, типа изменения фона рабочего стола в зависимости от погоды. Приложения и виджеты, предоставляющие такой сервис, уже имеются, а значит, данные должно быть легко добыть в Интернете. Быстрый поиск по словосочетанию «weather API data» непременно выдаст множество ссылок. Наши критерии: API должны быть понятны, охватывать как можно большую часть мира и иметь приличную документацию. Под них подпадает лишь пара из предложенных источников, в основном в связи с документацией – ну да, можно потратить время на распутывание данных или работы API, но зачем, если есть кому предоставить и данные, и руководство по их использованию?&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_66_1.jpg|300px]] Получить идентификатор вашей местности можно прямо у онлайн-службы Yahoo, просто скопировав открытый ею URL.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Пошарив там и сям, мы решили, что нас устраивает служба погоды Yahoo. Она проста и обладает достаточной документацией, чтобы начать без особых усилий. Еще чуток порывшись, мы обнаружили http://develoPer.yahoo.com/weather, где предоставлено множество деталей и пара примеров использования службы. Очко в пользу Yahoo!&lt;br /&gt;
&lt;br /&gt;
Метод Yahoo состоит в добавлении идентификатора местности в конец URL. В ответ служба генерирует RSS-ленту данных о погоде в указанном регионе. Это удобно во многих отношениях, поскольку означает, что даже код писать не придется. Идентификатор местности найти легко – согласно документации, достаточно пройти на главную страницу Yahoo! Weather, ввести город, и URL ваш (иногда, правда, при этом выскакивает название не города, а ближайшей к нему метеостанции).&lt;br /&gt;
&lt;br /&gt;
«St. Petersburg» даст нам http://weather.yahoo.com/forecast/RSXX0091.html – значит, код нашей местности RSXX0091. Теперь у нас есть информация о местоположении. Инструкция также говорит, что можно добавить параметр для выбора температуры по Фаренгейту или по Цельсию, и мы добавили к URL опцию по Цельсию '''u=c'''. Теперь протестируем URL, чтобы увидеть как он работает (о написании кода речи все еще нет).&lt;br /&gt;
&lt;br /&gt;
Приличный браузер, вроде ''Firefox'', способен отобразить RSS-ленту в удобной форме – надо всего лишь ввести ее URL: http://weather.yahooapis.com/forecastrss?p=RSXX0091&amp;amp;u=c.&lt;br /&gt;
&lt;br /&gt;
===Обработчик ленты===&lt;br /&gt;
&lt;br /&gt;
Теперь, зная, что нужная нам информация доступна в виде RSS-ленты, как заполучить ее в скрипт ''Python'' и декодировать? Скопировав указанный выше URL в ''Firefox'' и выбрав в меню '''Вид &amp;gt; Исходный код''', вы увидите кучу информации плюс всякие заголовки и прочее. Можно создать обработчик, который возьмет эти сырые данные и выудит из них соответствующие куски – но, как обычно и бывает, кто-то его уже создал. Для ''Python'' имеется библиотечный модуль под названием ''Feedparser'', создающий объект ''Python'' из RSS-потока. Проще всего установить его через менеджер пакетов: другие способы малость утомительны.&lt;br /&gt;
&lt;br /&gt;
После установки ''Feedparser'' наконец-то настает время кодирования. Сначала запустите ''Python'' из командной строки, чтобы понимать, с чем мы имеем дело. Вы окажетесь в интерактивной оболочке ''Python'', где мы и введем:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|left|Заголовок=Скорая помощь|Содержание=''Python'' требователен к синтаксису. Он требует выделять отступами блоки многострочных выражений, функций и условных операторов. Количество пробелов в отступе роли не играет: главное, чтобы оно сохранялось внутри блока.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; import feedparser&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; url = “http://weather.yahooapis.com/forecastrss?p=RSXX0091&amp;amp;u=c”&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; data = feedparser.parse(url)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; data&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_67_1.jpg|300px]] Убедитесь, что передаваемый URL выдает RSS-ленту, через ''Firefox'', который ее тут же отобразит|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Результатом действия последней строки будет выдача вереницы символов, которая представляет собой ленту. К счастью, хотя она и похожа на набор случайных данных, пронизанных частоколом скобок, на деле это хорошо структурированный объект. Чтобы убедиться в этом, попробуйте ввести в оболочке ''Python'' следующее:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;for x in data: &lt;br /&gt;
 ... print x&lt;br /&gt;
 ...&lt;br /&gt;
 feed&lt;br /&gt;
 status&lt;br /&gt;
 version&lt;br /&gt;
 encoding&lt;br /&gt;
 bozo&lt;br /&gt;
 headers&lt;br /&gt;
 etag&lt;br /&gt;
 href&lt;br /&gt;
 namespaces&lt;br /&gt;
 entries&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Это цикл, пробегающий по всем объектам внутри '''data'''. Одно из замечательных свойств ''Python'' – легкость работы с объектами, и даже возможность заставить их рассказать о себе. Например, пусть мы хотим точно знать, с каким типом объектов работаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;type(data)&lt;br /&gt;
 &amp;lt;class 'feedparser.FeedParserDict'&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ну, отчасти нам это помогло. Если вы уже сталкивались с ''Python'', то, вероятно, слышали про объекты-словари (ассоциативные массивы) – они просто хранят данные в виде пар ключ = значение. Объекты, список которых мы только что выводили, являются в данном случае ключами. Обратившись к документации ''Feedparser'', мы получим несколько более внятное представление, что хранят такие ключи, поскольку они стандартны для объектов ''Feedparser''. Из них для нас важен ключ entries. Он хранит объект-список отдельных записей RSS-ленты, которые и составляют ее реальное содержимое.&lt;br /&gt;
&lt;br /&gt;
Списки ''Python'' нумеруются с индекса '''0''', поэтому, чтобы сослаться на объект первой записи, следует использовать:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; data.entries[0]&lt;br /&gt;
 {'updated': u'Thu, 28 May 2009 2:00 am MSD', 'yweather_condition': u'', 'updated_parsed': ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; for x in data.entries[0]&lt;br /&gt;
 ... print x&lt;br /&gt;
 ...&lt;br /&gt;
 updated&lt;br /&gt;
 yweather_condition&lt;br /&gt;
 updated_parsed&lt;br /&gt;
 links&lt;br /&gt;
 title&lt;br /&gt;
 summary_detail&lt;br /&gt;
 geo_lat&lt;br /&gt;
 summary&lt;br /&gt;
 guidislink&lt;br /&gt;
 title_detail&lt;br /&gt;
 link&lt;br /&gt;
 geo_long&lt;br /&gt;
 yweather_forecast&lt;br /&gt;
 id&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И вновь мы имеем объект-словарь с парами ключей и значений. На сей раз они определяются самой XML-структурой ленты, поэтому для данного объекта нет модуля с голубой каемочкой; зато его элементы документированы на сайте Yahoo. После недолгого изучения становится ясно, что полезна нам будет сводка ('''summary''') текущих погодных условий, включая температуру.&lt;br /&gt;
&lt;br /&gt;
Налицо небольшая проблема: необходимые данные отнюдь не сосредоточены в одном поле нам на радость. Эта часть ленты – HTML-код для отображения на web-странице, а нам нужен только текст.&lt;br /&gt;
&lt;br /&gt;
===Регулярные выражения===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Регулярные выражения|Содержание=Регулярные выражения заполонили все вокруг. Они бывают и простенькими, и дьявольски сложными. Вкратце, регулярное выражение – это группа знаков, определяющая некую конфигурацию символов в строке. Имеются также специальные знаки, типа местозаполнителей, которые подразумевают любой символ. Кроме того, есть еще списки, группы и даже операторы для объединения соответствий – можно, например, создать регулярное выражение, полностью описывающее все базы для поиска.&lt;br /&gt;
&lt;br /&gt;
При создании шаблона лучше всего воспользоваться инструментом, который поможет вам проверить его корректность – даже один неверный символ чреват катастрофой! Среди лучших подобных инструментов – онлайн-построитель регулярных выражений http://gskInner.com/RegExr/. Вставьте в него пример текста и протестируйте свои навыки создания шаблонов. Не помешает и обратиться к документации: http://docs.python.org/library/re.html.&lt;br /&gt;
&lt;br /&gt;
[[Изображение:LXF120_69_1.jpg|300px]] Регулярные выражения не всякому по плечу; нам поможет служба http://gskinner.com/RegExr/|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
От регулярных выражений (также известных как «регекспы» [regex]) никуда не денешься – они будут все чаще встречаться на вашем пути переустройства мира. Регулярные выражения – это просто способ выполнения поиска и замены, и хотя они смахивают на криптограммы, разобраться в них не так уж трудно. В данном случае нам надо всего лишь избавиться от нудных HTML-тэгов. Мы, вероятно, и без того извлекли бы нужные данные, но подобный опыт пригодится нам в будущем, если мы захотим приспособить наш скрипт к работе с различными источниками.&lt;br /&gt;
&lt;br /&gt;
Мы импортируем ''Python''-модуль '''re''' (он включен в качестве одной из стандартных библиотек, так что ничего загружать и устанавливать не придется) и привлечем его к работе с этим текстом. На нашем уроке нет места на детальное объяснение работы регулярных выражений, а за краткими сведениями обратитесь ко врезке '''Регулярные выражения''' или статье из [[LXF80:Регулярные_выражения.|LXF80]].&lt;br /&gt;
 &lt;br /&gt;
Выражением мы хотим охватить все, что обрамлено знаками «больше» и «меньше», используемыми для обозначения HTML-тэгов. Это очень легко; выражение будет выглядеть как &amp;lt;, за которым следует шаблон любого символа, повторенный любое количество раз, то есть .'''+?''' и в конце '''&amp;gt;'''. '''+?''' – то же, что и '''+''', но это «ленивое» соответствие: оно отвечает наикратчайшей корректной строке. А нам того и надо – все, что находится между '''&amp;lt;&amp;gt;'''; других вариантов нет.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;summary = data.entries[0].summary&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;import re&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;pattern = '&amp;lt;.+?&amp;gt;'&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp = re.sub(pattern,'',summary)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp&lt;br /&gt;
 u'\nCurrent Conditions:\nLight Rain Shower, 12 C\nForecast:\nThu – Partly Cloudy. High: 25 Low:12\nFri – Mostly Sunny. High: 19 Low:&lt;br /&gt;
 9\n\nFull Forecast at Yahoo! Weather\n(provided by The Weather Channel)’&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь текст очищен от тэгов HTML; но в нем остались переводы строк. Вообще-то есть стандартный модуль для преобразования такой строки в список, но у нас уже загружен модуль re, и мы вполне можем им обойтись. Для поиска символов новой строки надо объяснить ''Python'', что мы хотим использовать чистое (raw) значение строки – поместив перед ней символ '''r'''.&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Заголовок=Почему ''Python''?|Содержание=Можно, естественно, писать скрипты и приложения для обработки web-данных на любом другом языке; так почему же мы выбрали ''Python'', а не ''C#'', например? На то есть веские причины. ''Python'' – язык простой и понятный, код на нем легко пишется и (что, вероятно, еще важнее) легко читается. Он обладает прекрасными возможностями для работы с текстом (которым по большей части и являются наши данные), он кросс-платформенный и снабжен бездной полезных библиотек для web-служб и протоколов. Используя ''Python'' и пару библиотек, можно мигом создать рабочее приложение или скрипт.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; temp = re.split(r'\n',temp)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; temp&lt;br /&gt;
 [u'', u'Current Conditions:', u'Light Rain Shower, 12 C', u'Forecast:', u'Thu – Partly Cloudy. High: 25 Low: 12', u'Fri – Mostly Sunny. High:&lt;br /&gt;
 19 Low: 9', u'', u'Full Forecast at Yahoo! Weather', u'(provided by The Weather Channel)']&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp[2]&lt;br /&gt;
 u'Light Rain Shower, 12 C'&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Как видите, мы предположили, что необходимую строку содержит третий элемент полученного списка. Чтобы добыть из него температуру, воспользуемся другим регулярным выражением, отбирающим из строки исключительно цифры.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp = re.findall(u'[0‑9]+',temp[2])[0]&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;temp&lt;br /&gt;
 u'12'&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; temp = int(temp)&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; temp&lt;br /&gt;
 12&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Финальный шаг – употребить встроенное в ''Python'' преобразование типов, превратив строку со значением температуры в целое число: числа проще сравнивать. (В реальном скрипте мы можем, эффективности ради, объединить некоторые из приведенных этапов, но это не даст большого выигрыша для приложения, а ясность пошаговой записи будет утрачена.) Осталось только создать то, что мы посулили в начале урока: обои рабочего стола, меняющиеся в зависимости от погоды&lt;br /&gt;
&lt;br /&gt;
===Перемена погоды===&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_68_2.jpg|300px]] Сберегите свой рассудок — для написания кода ''Python'' пользуйтесь IDE; это сильно упрощает обнаружение ошибок.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
Как переделать обои? А для этого в ''Python'' есть вызов внешних команд. В Gnome можно изменить заставку командой ''gconftool-2'', устанавливающей переменную окружения, в которой хранится размещение и имя файла обоев. Оно бы и достаточно. Но поскольку у нас возможны варианты, лучше оформить это в виде функции.&lt;br /&gt;
&lt;br /&gt;
Несложная функция не особо напряжет вам мозг. ''Python'' обладает простой конструкцией: описание функции и ее параметров, за которым следует текст с отступом. Ее даже можно создать в интерактивной оболочке:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; def change_wallpaper(filename):&lt;br /&gt;
 ... cmd = string.join([“gconftool-2 -s /desktop/gnome/background/picture_filename -t string \””,filename,”\””],'')&lt;br /&gt;
 ... os.system(cmd)&lt;br /&gt;
 ...&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; change_wallpaper('plop.jpg')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Первая строка функции создает команду оболочки, а вызов '''os.system'' выполняет ее. Вызов функции меняет переменную окружения, и загружается новое изображение. Подставленное нами имя файла '''filename''' – просто параметр; в реальности, хорошо бы хранить ваши изображения где-нибудь внутри вашего домашнего каталога, допустим, в подкаталоге с именем '''weather''', и называть их согласно погодным условиям.&lt;br /&gt;
&lt;br /&gt;
Сейчас Gnome допускает в качестве обоев SVG-изображения, и вы можете создать этакую изысканную масштабируемую картину для вашего рабочего стола.&lt;br /&gt;
Не знаем, как по-вашему, но мы думаем, что здесь должно быть пять изображений: freezing [мороз], cold [холод], mild [средне], warmish [тепло] и hot [жарко]. Диапазоны температур выбирайте в соответствии с вашим климатом, а мы присвоим следующие: ниже 0°C – мороз, 0–8 – холод, 9–15 – средне, 16–25 – тепло, выше – жарко. В некоторых языках для реализации проверки предусмотрена конструкция '''case/switch'''. В ''Python'' ее нет, и мы нагородим огород из конструкций '''if/elif/else''', вот так:&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Содержание=[[Изображение:LXF120_68_1.jpg|300px]] Кого же не согреет милый снегопад на SVG-обоях рабочего стола? Они могут быть вашими.|Ширина=300px}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 &amp;gt;&amp;gt;&amp;gt; if (temp &amp;lt;0):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/freezing.svg')&lt;br /&gt;
 ... elif (temp&amp;lt;9):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/snow.svg')&lt;br /&gt;
 ... elif (temp&amp;lt;16):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/mild.svg')&lt;br /&gt;
 ... elif (temp&amp;lt;26):&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/warm.svg')&lt;br /&gt;
 ... else:&lt;br /&gt;
 .. change_wallpaper('/home/evilnick/weather/hot.svg')&lt;br /&gt;
 ...&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Объединив все это в один скрипт, мы получим нечто подобное следующему (остается только разжиться изображениями):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=Python&amp;gt;&lt;br /&gt;
 #!/usr/bin/python&lt;br /&gt;
 # -*- coding: utf-8 -*-&lt;br /&gt;
 import feedparser,re,os,string&lt;br /&gt;
 def change_wallpaper(filename):&lt;br /&gt;
  cmd = string.join([“gconftool-2 -s /desktop/gnome/&lt;br /&gt;
 background/picture_filename -t string \””,filename,”\””],'')&lt;br /&gt;
  os.system(cmd)&lt;br /&gt;
 url = “http://weather.yahooapis.com/&lt;br /&gt;
 forecastrss?p=RSXX0091&amp;amp;u=c”&lt;br /&gt;
 data = feedparser.parse(url)&lt;br /&gt;
 # extract the summary from the data&lt;br /&gt;
 summary = data.entries[0].summary&lt;br /&gt;
 temp = re.split(r'\n',re.sub('&amp;lt;.+?&amp;gt;','',summary))&lt;br /&gt;
 temp = int(re.findall('[0‑9]+',temp[2])[0])&lt;br /&gt;
 if (temp &amp;lt;0):&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/freezing.svg')&lt;br /&gt;
 elif (temp&amp;lt;9):&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/snow.svg')&lt;br /&gt;
 elif (temp&amp;lt;16):&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/mild.svg')&lt;br /&gt;
 elif (temp&amp;lt;26):&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/warm.svg')&lt;br /&gt;
 else:&lt;br /&gt;
  change_wallpaper('/home/evilnick/weather/hot.svg')&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Врезка|Загловок=Форматы web-данных|Содержание=Мы осознали, что есть масса web-приложений, способных доставить нам данные. Но вы ведь не ждали, что все будет просто, не так ли? Протоколов или способов предоставления данных немало, и некоторые сайты (например, Flickr) даже предусматривают более одного варианта. Еще одно неудобство – разнобой в их использовании на сайтах. В нашей серии уроков мы постепенно все это рассмотрим.|Ширина=200px}}&lt;br /&gt;
&lt;br /&gt;
Конечно, даже при буйном воображении это не полноценное приложение, а небольшой сценарий, но его вполне можно взять за основу. На данном уроке мы взяли данные из сети и автоматически совместили их с контекстом рабочего стола. Мы увидели, как просто выглядят RSS-ленты и как работать с объектами в ''Python''; постигли ужасы регулярных выражений; и рассмотрели совершение из ''Python'' системных вызовов для выполнения внешних команд. Вот так мы и можем, исследуя сервисы всемирной паутины, брать что угодно и ставить себе на службу.&lt;br /&gt;
&lt;br /&gt;
Скрипт легко расширить (например, позволив пользователям выбирать местоположение) или преобразовать его в апплет. Покамест он завершился бы с ошибкой при отсутствии подключения к Интернету, что не есть хорошо, но на следующих уроках мы изучим, как с этим справиться. Оставайтесь с нами! '''LXF'''&lt;/div&gt;</summary>
		<author><name>Crazy Rebel</name></author>	</entry>

	</feed>