Я предполагаю, что ваш документ XHTML зашифрован в utf-8. Проблема заключается в том, что кодировка не указана в документе HTML. По умолчанию браузеры и lxml.html предполагают, что HTML-документы кодируются в ISO-8859-1, поэтому ваш документ анализируется неправильно. Если вы откроете его в браузере, он также будет отображаться неправильно.
Вы можете указать кодировку вашего документа следующим образом:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>title</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
</head>
Вы можете принудительно применить кодировку, используемую lxml, таким же образом (например, вы можете изменить кодировку, используемую в вашем браузере):
file = open(fname)
filecontents = file.read()
filecontents = filecontents.decode("utf-8")
htree = lxml.html.fromstring(filecontents)
print htree.xpath("//span[@id='demo']")[0].text