lxml документация гласит : «Поддержка разбора поврежденного HTML полностью зависит от алгоритма восстановления libxml2. Это не ошибка lxml, если вы найдете документы, которые настолько сильно повреждены, что анализатор не может их обработать. Также нет гарантии, что результирующее дерево будет содержать все данные из исходного документа. Парсеру, возможно, придется отбросить серьезно сломанные части при попытке продолжить анализ. "
И, конечно же, HTML-код, возвращенный Baidu, недействителен: валидатор W3C сообщает"173 ошибки, 7 предупреждений". Я не знаю (и не исследовал), вызвали ли эти конкретные ошибки вашу проблему с lxml, потому что я думаю, что ваша стратегия использования lxml для анализа HTML, найденного «в дикой природе» (который почти всегда недействителен), обречена .
Для анализа недопустимого HTML вам нужен анализатор, который реализует ( на удивление странный! ) алгоритм восстановления ошибок HTML. Поэтому я рекомендую заменить lxml на html5lib , который без проблем обрабатывает неверный HTML-код Baidu:
>>> import urllib
>>> from html5lib import html5parser, treebuilders
>>> p = html5parser.HTMLParser(tree = treebuilders.getTreeBuilder('dom'))
>>> dom = p.parse(urllib.urlopen('http://www.baidu.com/s?wd=foo').read())
>>> len(dom.getElementsByTagName('table'))
12