2

現在、HTML 要素と属性を抽出するために BeautifulSoup を使用しています。
また、抽出された各要素のネストされたレベルも知りたいです。

例えば:

サンプル 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
-----------------------------------

要素とそれに関連付けられた属性を抽出できますが、その特定の要素へのパスを取得する適切な方法を見つけることができません。

BeautifulSoup を使用して同じものを抽出するにはどうすればよいですか? 同じものを抽出するために使用できる他のライブラリはありますか?

前もって感謝します。

4

2 に答える 2

1

パスを取得するには、次のようなことを試すことができます。

[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'
于 2012-12-04T07:14:00.360 に答える
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
>>> 
于 2012-12-04T07:22:22.857 に答える