私はちょっとハックなことをしなければならない状況にいます。着信データは私の管理下にないため、解決策は「より効果的に保存するだけ」ではありません。
私が得ているものは次のようになります
<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 ペアを表していることを必ずしも知っているわけではありません( table
s はデータ表現だけでなく配置にも使用されます。いいえ、わかりません'理由はわかりません。) したがって、最も簡単な解決策は次のように思われます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
その行では、その理解から出てくるリストの別のトラバーサルを行う必要があるようです。この場合、それは最適化されますか?ワンパスでそれを行う方法はありますか?