如何使用BeautifulSoup提取HTML元素的嵌套级别?

时间:2012-12-04 06:55:55

标签: python beautifulsoup lxml

我目前正在使用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提取相同内容? 是否有其他库可用于提取相同的文件?

提前致谢。

2 个答案:

答案 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'