#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))