Index: /trunk/genshi/input.py
===================================================================
--- /trunk/genshi/input.py	(revision 1218)
+++ /trunk/genshi/input.py	(revision 1219)
@@ -402,7 +402,12 @@
 
     def handle_pi(self, data):
-        target, data = data.split(None, 1)
         if data.endswith('?'):
             data = data[:-1]
+        try:
+            target, data = data.split(None, 1)
+        except ValueError:
+            # PI with no data
+            target = data
+            data = ''
         self._enqueue(PI, (target.strip(), data.strip()))
 
Index: /trunk/genshi/tests/input.py
===================================================================
--- /trunk/genshi/tests/input.py	(revision 1218)
+++ /trunk/genshi/tests/input.py	(revision 1219)
@@ -178,4 +178,23 @@
         self.assertEqual('echo "Foobar"', data)
 
+    def test_processing_instruction_no_data_1(self):
+        text = u'<?foo ?>'
+        events = list(HTMLParser(StringIO(text)))
+        kind, (target, data), pos = events[0]
+        self.assertEqual(Stream.PI, kind)
+        self.assertEqual('foo', target)
+        self.assertEqual('', data)
+
+    def test_processing_instruction_no_data_2(self):
+        text = u'<?experiment>...<?/experiment>'
+        events = list(HTMLParser(StringIO(text)))
+        kind, (target, data), pos = events[0]
+        self.assertEqual(Stream.PI, kind)
+        self.assertEqual('experiment', target)
+        self.assertEqual('', data)
+        kind, (target, data), pos = events[2]
+        self.assertEqual('/experiment', target)
+        self.assertEqual('', data)
+
     def test_xmldecl(self):
         text = '<?xml version="1.0" ?><root />'
