我目前正在使用BeautifulSoup来提取HTML元素和属性 我也想知道提取的每个元素的嵌套级别。
例如:
示例HTML:
<html>
<head>
<title>Element Attributes Test</title>
</head>
<body>
<div id="abc">
<ol id="def">
<li class="testItem"> <a href="http://testpage.html">
</li>
<li class="testItem"> <table id="testTable">
<tr>
<td>
<div id="testDiv">
</div>
</td>
</tr>
</table>
</li>
</ol>
</div>
</body>
</html>
我想将特定元素的路径信息作为路径列中的输出。
----------------------------------
Element | Attribute | Path
----------------------------------
html | None | document
----------------------------------
head | None | html
----------------------------------
title | None | html.head
----------------------------------
body | None | html
----------------------------------
div | id="abc" | html.body
-----------------------------------
ol | id="def" | html.body.div
-----------------------------------
li | class=".."| html.body.div.ol
-----------------------------------
a | href=".." | html.body.div.ol.li
-----------------------------------
li | class=".."| html.body.div.ol
-----------------------------------
table | id="..." | html.body.div.old.li
-----------------------------------
tr | None | html.body.div.li.table
-----------------------------------
我能够提取Element及其相关属性,但无法找到获取该特定元素路径的适当方法。
如何使用BeautifulSoup提取相同内容? 是否有其他库可用于提取相同的文件?
提前致谢。
答案 0 :(得分:1)
您可以采用以下方法获取所有html元素的自下而上路径
>>> for elem in soup.findAll():
path = '.'.join(reversed([p.name for p in elem.parentGenerator() if p]))
print "{:10}|{:60}|{:10}".format(elem.name,elem.attrs, path)
html |[] |[document]
head |[] |[document].html
title |[] |[document].html.head
body |[] |[document].html
div |[(u'id', u'abc')] |[document].html.body
ol |[(u'id', u'def')] |[document].html.body.div
li |[(u'class', u'testItem')] |[document].html.body.div.ol
a |[(u'href', u'http://testpage.html')] |[document].html.body.div.ol.li
li |[(u'class', u'testItem')] |[document].html.body.div.ol
table |[(u'id', u'testTable')] |[document].html.body.div.ol.li
tr |[] |[document].html.body.div.ol.li.table
td |[] |[document].html.body.div.ol.li.table.tr
div |[(u'id', u'testDiv')] |[document].html.body.div.ol.li.table.tr.td
>>>
答案 1 :(得分:0)
要获得路径,您可以尝试这样的事情:
[i.name for i in soup.findAll('div',{'id':'testDiv'})[0].findParents()]
输出:
['td', 'tr', 'table', 'li', 'ol', 'div', 'body', 'html', u'[document]']
或:
'.'.join([i.name for i in soup.findAll('div',{'id':'testDiv'})[0].findParents()][::-1])
将其作为字符串:
u'[document].html.body.div.ol.li.table.tr.td'