HTML структура в сетевой граф - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь представить DOM сайта HTML (объектную модель документа) в сетевом графе, а затем выполнить некоторые статистические вычисления с этим графом (например, степень, промежуточность, близость, построение графика и т. Д.).).Я не мог найти библиотеку или предыдущий пост SO, который делает это напрямую.Моя идея заключалась в том, чтобы использовать BeautifulSoup Library, а затем Networkx Library.Я попытался написать некоторый код, проходящий через каждый элемент структуры HTML (используя recursive=True).Но я не знаю, как идентифицировать каждый уникальный тег (вы видите здесь, что добавление второго h1 узла в график перезаписывает первый, то же самое для родителей, поэтому в конце график полностью ложен).

<code>import networkx as nx
import bs4
from bs4 import BeautifulSoup
ex0 = "<html><head><title>Are you lost ?</title></head><body><h1>Lost on the Intenet ?</h1><h1>Don't panic, we will help you</h1><strong><pre>    * <----- you are here
"soup = BeautifulSoup (ex0) G = nx.Graph () для тега в sou.findAll (рекурсивный = True): G.add_node (tag.name) G.add_edge (tag.name, tag.findParent (). name) nx.draw (G) G.nodes #### NodeView (('html', '[document]', 'head', 'title', 'body','h1', 'strong', 'pre'))

enter image description here

Любая идея о том, как это можно сделать (включая совершенно разные подходы)Спасибо.

PS: график может быть направлен или нет, мне все равно.

1 Ответ

0 голосов
/ 17 декабря 2018

Вы можете перебрать атрибут content каждого объекта BeautifulSoup.Чтобы отобразить метки, просто используйте атрибут with_labels в nx.draw:

<code>import networkx as nx
import matplotlib.pyplot as plt
from collections import defaultdict
from bs4 import BeautifulSoup as soup
ex0 = "<html><head><title>Are you lost ?</title></head><body><h1>Lost on the Intenet ?</h1><h1>Don't panic, we will help you</h1><strong><pre>    * <----- you are here
"d = суп (ex0, 'html.parser') def _traverse_html (_d:суп, _graph: nx.Graph, _counter, _parent = None) -> None: для i в _d.contents: если i.name не None: try: _name_count = _counter.get (i.name), если _parent не None: _graph.add_node (_parent) _graph.add_edge (_parent, i.name, если не _name_count, иначе f '{i.name} _ {_ name_count}') _counter [i.name] + = 1 _traverse_html (i, _graph, _counter,i.name) кроме AttributeError: pass _full_graph = nx.Graph () _traverse_html (d, _full_graph, defaultdict (int)) nx.draw (_full_graph, with_labels = True) plt.show ()

enter image description here

...