0

以下のような形式のxhtmlファイルがあります。タグ間のすべてのテキストを順番に取得しようとしています。BAC以外のすべてを取得するには、自分のリストを呼び出してthis_list = get_e('td')、そのリストを別の関数に渡して、テキストをとして取得しますget_text(this_list)。すべてのテキストを取得するために、関数にわずかな変更を加えることができるかどうか疑問に思っています。誰かがこれについていくつかのアドバイスを提供できますか?

<tr>
  <td colspan="1" rowspan="1" class="lft">
    <a shape="rect" href="http://www.usatoday.idmanagedsolutions.com/stocks/new/quote.idms?SYMBOL_US=BAC">
        BAC</a>
  </td>
  <td colspan="1" rowspan="1" class="lft">
    Bank Of America Corporation</td>
  <td colspan="1" rowspan="1">
    9.79
   </td>
  <td colspan="1" rowspan="1">
    -0.07
  </td>
  <td colspan="1" rowspan="1">
    <span class="neg-arrw">
        -0.71%
    </span>
   </td>
   <td colspan="1" rowspan="1">
    71,370,166
   </td>
</tr>
<tr class="evenrow">
   <td colspan="1" rowspan="1" class="lft">
    VALE
   </td>
   <td colspan="1" rowspan="1" class="lft">
    Vale S A
   </td>
<td colspan="1" rowspan="1">
    17.52
   </td>
   <td colspan="1" rowspan="1">
    +0.09
   </td>
   <td colspan="1" rowspan="1">
    <span class="pos-arrw">
        +0.49%
    </span>
   </td>
   <td colspan="1" rowspan="1">
    15,461,788</td>
</tr>

以下の機能を使用しています

def get_e(tag):
    l=[]
    els=dom.getElementsByTagName(tag)
    for e in els:
        for child_el in els.childNode:
            lst.append(child_el)
    return l

def get_text(els):
    l=[]
    for e in els
        if e.nodeType == e.TEXT_NODE:
            l.append(e.data)
    return lst
4

1 に答える 1

2

get_text関数は、テキストノードのみを持つ入力を想定しています。一部のtdには、要素ノードであるaが埋め込まれています。これを更新して、要素ノードの表示時にget_eを再帰的に呼び出すようにしました。

from xml.dom import minidom
import pdb

def get_e(dom, tag):
    l=[]
    els=dom.getElementsByTagName(tag)
    for e in els:
        for child_el in e.childNodes:
            # if this was an element node get its children
            if child_el.nodeType == e.ELEMENT_NODE:
                l.extend(get_e(e, child_el.tagName))
            else:
                l.append(child_el)
    return l

def get_text(els):
    l=[]
    for e in els:
        if e.nodeType == e.TEXT_NODE:
            l.append(e.data)
    return l

dom = minidom.parse('s.xml')
print get_text(get_e(dom, 'td'))

または、おそらくあなたはより短いものを検討することができます:-

import xml.etree.ElementTree as ET
et = ET.parse('s.xml')
print [e.findtext('.') for e in et.findall('.//*')]
于 2012-12-06T10:25:29.583 に答える