0

私はちょっとハックなことをしなければならない状況にいます。着信データは私の管理下にないため、解決策は「より効果的に保存するだけ」ではありません。

私が得ているものは次のようになります

<table>
  <tr>
    <td>Key 1</td>
    <td>Key 2</td>
    <td>Key 3</td>
    ...
  </tr>
  <tr>
    <td>Val 1</td>
    <td>Val 2</td>
    <td>Val 3</td>
    ...
  </tr>
  ...
</table>

私が望むのは、特定のテーブルから特定のキーと値のペアを厳選することです。だから、次のようなもの

{ 'Key 4': 'Val 4', 'Key 32': 'Val 32' ... }

tr事前に適切なキーを知っていますが、それらがどこに配置されているか、またはs のすべてのペアが k/v ペアを表していることを必ずしも知っているわけではありません( tables はデータ表現だけでなく配置にも使用されます。いいえ、わかりません'理由はわかりません。) したがって、最も簡単な解決策は次のように思われますget me the contents of the nth cell of the next row where n is this cells' index

私が持っているのは

def findField(soup, fieldName):
    kTd = soup.find(text=fieldName).parent
    ix = len(kTd.findPreviousSiblings('td'))
    valTd = kTd.parent.findNext('tr').findAll('td')[ix]
    return (kTd, valTd)

def fieldsToDict(soup, fieldNames):
    return dict([findField(soup, k) for k in fieldNames])

fieldsToDict(soup, ['Key 4', 'Key 32' ..])

しかし、これを表現するためのよりエレガントで効率的な方法が必要なようです。

何かご意見は?

編集:私はこれを考えすぎているかもしれませんが、より具体的に説明します。この質問は、おそらく SO ではなく codereview.se に配置する必要がありました。私よりも多くの Python/BeautifulSoup を持っている人からの指摘が欲しかった 2 つの具体的なこと。

初め、

...
    ix = len(soup.findPreviousSiblings('td'))
...

より大きな行では比較的高価になる可能性があるようです。私が取得しようとしている情報は、HTML の最初の解析中に取得できるようです。の行に沿って組み込みのメソッド/スロットはありindexAmongPeersますか?

2番

...
    return dict([findField(soup, k) for k in fieldNames])

dictその行では、その理解から出てくるリストの別のトラバーサルを行う必要があるようです。この場合、それは最適化されますか?ワンパスでそれを行う方法はありますか?

4

1 に答える 1

0

調べるのは少し難しいと思います-私は次のように行きます:

rows = [tr.strings for tr in soup('tr')]
lookup = {k:v for k,v in zip(*rows) if k in {'Key 1', 'Key 2'}}
# {u'Key 1': u'Val 1', u'Key 2': u'Val 2'}
于 2013-02-22T17:41:51.253 に答える