Немного смущен эффектами этих двух методов.Вот простая строка:
test = """
<p> This is my head <h1> this is my middle </h1> and this is my tail.</p>
"""
Мы создадим два корня с этой строкой:
from lxml import html, etree
root_e = etree.fromstring(test)
root_h = html.fromstring(test)
Давайте посмотрим, как выглядят деревья:
tree_e = etree.ElementTree(root_e)
for elem in root_e.iter():
print(tree_e.getpath(elem))
Вывод:
/p
/p/h1
, чего я и ожидал.Однако с:
tree_h = etree.ElementTree(root_h)
for elem in root_h.iter():
print(tree_h.getpath(elem))
теперь вывод:
/html/div
/div/p
/div/h1
, чего я не ожидал.И следуют странные последствия.Различные выражения xpath работают одинаково в обоих деревьях, но другие этого не делают.Например,
root_h.xpath('/html/div')[0].text_content()
выводит весь текст строки (с присоединенной новой строкой), хотя test
не содержит ни html
, ни div
.С другой стороны,
root_h.xpath('/html/div')[0].text
ничего не делает.
Так почему же различия и когда следует использовать одно или другое?