Следующий тест читает файл, а с помощью lxml.html генерирует листовые узлы DOM/Graph для страницы.lxml convert element to elementtree
Однако, я также пытаюсь выяснить, как получить входные данные из строки. Использование
lxml.html.fromstring(s)
не работает, так как это создает «элемент» в отличие от «ElementTree».
Итак, я пытаюсь понять, как преобразовать элемент в ElementTree.
Мысли
тестовый код ::
import lxml.html
from lxml import etree # trying this to see if needed
# to convert from element to elementtree
#cmd='cat osu_test.txt'
cmd='cat o2.txt'
proc=subprocess.Popen(cmd, shell=True,stdout=subprocess.PIPE)
s=proc.communicate()[0].strip()
# s contains HTML not XML text
#doc = lxml.html.parse(s)
doc = lxml.html.parse('osu_test.txt')
doc1 = lxml.html.fromstring(s)
for node in doc.iter():
if len(node) == 0:
print "aaa ",node.tag, doc.getpath(node)
#print "aaa ",node.tag
nt = etree.ElementTree(doc1) <<<<< doesn't work.. so what will??
for node in nt.iter():
if len(node) == 0:
print "aaa ",node.tag, doc.getpath(node)
#print "aaa ",node.tag
============================== =
обновление :::
(разбор HTML вместо XML) Добавлено изменения, предложенные Аббасом. получили следующие заблуждается:
doc1 = etree.fromstring(s)
File "lxml.etree.pyx", line 2532, in lxml.etree.fromstring (src/lxml/lxml.etree.c:48621)
File "parser.pxi", line 1545, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:72232)
File "parser.pxi", line 1424, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:71093)
File "parser.pxi", line 938, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:67862)
File "parser.pxi", line 539, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:64244)
File "parser.pxi", line 625, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:65165)
File "parser.pxi", line 565, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:64508)
lxml.etree.XMLSyntaxError: Entity 'nbsp' not defined, line 48, column 220
UPDATE :::
Управляемый, чтобы получить тестовую работу. Я не совсем уверен, почему. Если кто-то с измельчителем хочет дать объяснение, это поможет будущим людям, которые спотыкаются на это.
from cStringIO import StringIO
from lxml.html import parse
doc1 = parse(StringIO(s))
for node in doc1.iter():
if len(node) == 0:
print "aaa ", node.tag, doc1.getpath(node)
оказывается, что модуль StringIO/класс реализует функциональные возможности ввода-вывода, который удовлетворяет то, что пакет синтаксического анализа должен идти вперед и обрабатывать входной строки для тестового HTML. похожие на то, что отливка обеспечивает на других языках, возможно ...
благодаря
XML-парсер несогласие с « » в вашем HTML. Ваш HTML должен быть хорошо сформирован и либо не должен содержать символов, которые парсер не может переваривать, либо их следует экранировать правильно. – Abbas
эй Аббас.Я не согласен с тем, что вы говорите. Html в тестовом файле теперь работает, когда я реализую решение, указанное выше, используя StringIO в синтаксическом анализе. –
Это потому, что теперь вы используете парсер HTML (lxml.html) и StringIO. etree. etree пытается проанализировать HTML, но сбой из-за символов, закодированных для HTML ( ). Я не знаю, почему вы не согласились бы со мной, когда я предложил решение, основанное на вашем требовании получить ElementTree от etree, передав ему строку. Позднее вы изменили свое решение, мое решение по-прежнему действует для вашего первоначального требования. – Abbas