python, создайте вложенные html-узлы. Как мне пройти по дереву Dom из графика, найти его непосредственных потомков и создать из него html-файл?

#python #recursion #beautifulsoup #graph #agens-graph

#питон #рекурсия #прекрасный суп #График #агент-график

Вопрос:

Я пытаюсь рекурсивно извлечь дерево DOM, сохраненное в базе данных graph, чтобы детализировать их как HTML, JSON или другие файлы шаблонов. Мотивация, в которой я нуждался, заключалась в том, чтобы иметь простой способ извлечения и управления узлами DOM, переписывая их в любой необходимый формат шаблонов, который может быть интегрирован в разработку CMS или MVC, где интерполяция переменных имеет первостепенное значение.

Моя попытка использовать рекурсию не удалась, потому что я не знаю, что использовать в качестве следующего родительского или дочернего узла.

Что мне нужно сделать, так это посетить следующее дерево, мне нужно создать эквивалентный HTML-файл, используя на данный момент либо beautifulsoup, либо другую утилиту.

 html  head  title  body  div  div  ul  li  

С помощью следующего кода, без рекурсивной функции, я могу получить непосредственные дочерние элементы, в результате чего значение:

 |gt; parent Id: 844424930131969 --- parent tag HTML  child id 844424930131970 child tag: head  child id 844424930131973 child tag: body  

или следующий html — файл:

 lt;htmlgt;  lt;headgt;  lt;/headgt;  lt;bodygt;  lt;/bodygt; lt;/htmlgt;  

Как мне пройти d , чтобы иметь возможность быть частью следующей рекурсии, где я смогу получить ее потомков?

 cursor = ag.execCypher("MATCH (n:node {tag: 'html'}) RETURN n")  t = [x[0].id for x in cursor] print(t[0])  def graph_dom(t_id):  parent = ag.execCypher("MATCH (n:node) WHERE id(n) = %s RETURN n", params=(t_id,))  p = [x[0] for x in parent]  pt = p[0]["tag"]   pid = p[0].id  print(f"|gt; parent Id: {pid} --- parent tag {pt}")  parent_tag = soup.new_tag(name=p[0]["tag"])  soup.append(parent_tag)  children = ag.execCypher("MATCH (v:node)-[R:connect]-gt;(V2) WHERE id(v) = %s RETURN V2", params=(p[0].id,))  for d in children:  children_tag = soup.new_tag(name=d[0]["tag"])  parent_tag.append(children_tag)  dt = d[0]["tag"]  did = d[0].id  print(f"child id {did} child tag: {dt}")   # graph_dom() # I need to add a recursive argument    graph_dom(t[0])  file_soup = soup.prettify() with open("helloworld.html", "w") as file:  file.write(str(file_soup))  

Ответ №1:

Я думаю, что вы должны вызвать graph_dom(did) рекурсивно в цикле children .

 cursor = ag.execCypher("MATCH (n:node {tag: 'html'}) RETURN n")  t = [x[0].id for x in cursor] print(t[0])  def graph_dom(t_id):  parent = ag.execCypher("MATCH (n:node) WHERE id(n) = %s RETURN n", params=(t_id,))  p = [x[0] for x in parent]  pt = p[0]["tag"]   pid = p[0].id  print(f"|gt; parent Id: {pid} --- parent tag {pt}")  parent_tag = soup.new_tag(name=p[0]["tag"])  soup.append(parent_tag)  children = ag.execCypher("MATCH (v:node)-[R:connect]-gt;(V2) WHERE id(v) = %s RETURN V2", params=(p[0].id,))  for d in children:  children_tag = soup.new_tag(name=d[0]["tag"])  parent_tag.append(children_tag)  dt = d[0]["tag"]  did = d[0].id  print(f"child id {did} child tag: {dt}")   graph_dom(did) # Call graph_dom recursively.    graph_dom(t[0])  file_soup = soup.prettify() with open("helloworld.html", "w") as file:  file.write(str(file_soup))