【发布时间】:2019-05-17 22:34:45
【问题描述】:
我要做的是将 HTML 站点 DOM(文档对象模型)表示为网络图,然后使用该图进行一些统计计算(如度数、介数、接近度、绘图等)。 )。我找不到任何直接执行此操作的库或以前的 SO 帖子。我的想法是使用BeautifulSoup Library,然后是Networkx Library。我尝试编写一些代码循环遍历 HTML 结构的每个元素(使用 recursive=True)。但我不知道如何识别每个唯一标签(您在这里看到,在图中添加第二个 h1 节点会覆盖第一个节点,对于父母来说也是如此,因此该图最终完全是错误的)。
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</pre></strong></body></html>"
soup = BeautifulSoup(ex0)
G=nx.Graph()
for tag in soup.findAll(recursive=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'))
关于如何完成的任何想法(包括完全不同的方法)。谢谢
PS:图可以有向与否,我不在乎。
【问题讨论】:
-
您必须循环所有嵌套元素。 stackoverflow.com/questions/36108621/…
-
@PedroLobito 谢谢,我已经这样做了,但我的问题是标签的唯一性甚至标签值
-
您可以使用字典来存储每个带有唯一键的标签,即:
{'div1', element1, 'div2': element2} -
是的,这可能很好,但我不知道如何在我的代码中实现它:-)。 Beautifulsoup 将只接受标准标签,而不接受名称中带有一些识别数字的标签...
-
我了解,但我也没有时间为您开发自定义答案。 GL!
标签: python dom graph beautifulsoup networkx