Разница в деревьях, генерируемых html.fromstring () и etree.fromstring () - PullRequest
0 голосов
/ 20 июня 2019

Немного смущен эффектами этих двух методов.Вот простая строка:

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

ничего не делает.

Так почему же различия и когда следует использовать одно или другое?

...