4

現在、テーブルを配列に解析しようとすると、少し問題が発生します。

BS4で解析し、セルの内容を配列に入れる必要がある単純なテーブル(ここ)があります。ここで問題となるのは、セルにテキストが含まれておらず、「確認」または「サイト」というタイトルの画像が含まれていることです。これはユーザーの権利にすぎません。 [チェックボックスを含む行1をスキップしています。問題なく抽出できるチェックボックスです]

上記のフィドルを見ると、私がする必要があるのは、結果の配列が次のようになるように解析することだけです。

Array1[0] = User1,Confirm,Confirm,Site,Confirm
Array1[1] = User2,Confirm,Confirm,Confirm,Confirm
Array1[2] = User3,Confirm,Confirm,Confirm,Confirm
Array1[3] = User4,Confirm,Site,Site,Confirm

その後、私は好きなようにそれを行うことができます。もう1つの厄介な問題は、行数が異なる場合があるため、スクリプトがこれに適応し、テーブルから配列を再帰的に作成できるようにする必要があることです。

現時点では、StackOverflowが私の唯一の希望です。私は過去10時間、これを自分で行うことにほとんどまたはまったく成功せず、率直に言って希望を失いました。何かを取り出すのに最も近かったのは、囲まれたタグを抽出することでしたが、奇妙な理由でそれ以上解析できませんでした。おそらく、bs4のネストの制限ですか?誰か見てください、そして彼らがこれを行う方法を見つけることができるかどうか見てください?または、少なくともそこに到達する方法を説明しますか?

var description:rightml-テーブルのスープ。

allusers = []
rows = rightml.findAll('tr')
for tr in rows:
    cols = tr.findAll('td')
    for td in cols:
        if (td.find(title="Group")) or (td.find(title="User")):
            text = ''.join(td.text.strip())
            allusers.append(text)
print allusers

gifrights = []

rows7 = rightml.findAll('td')
#print rows7
for tr7 in rows:
    cols7 = tr7.findAll('img')
    for td7 in cols7:
        if (td7.find(title="Confirm")) or (td7.find(title="Site")):
            text = ''.join(td7.text.strip())
            text2 = text.split(' ')
            print text2
            gifrights.append(text2)

私はこのコードでかなり離れている可能性があります..しかし、私はそれに古い大学の試みを与えました。

4

2 に答える 2

6

この作品のようなものでしょうか:

rows = soup.find('tbody').findAll('tr')

for row in rows:
    cells = row.findAll('td')

    output = []

    for i, cell in enumerate(cells):
        if i == 0:
            output.append(cell.text.strip())
        elif cell.find('img'):
            output.append(cell.find('img')['title'])
        elif cell.find('input'):
            output.append(cell.find('input')['value'])
    print output

これにより、次のように出力されます。

[u'Logged-in users', u'True', u'True', u'True', u'True']
[u'User 1', u'Confirm', u'Confirm', u'Site', u'Confirm']
[u'User 2', u'Confirm', u'Confirm', u'Confirm', u'Confirm']
[u'User 3', u'Confirm', u'Confirm', u'Confirm', u'Confirm']
[u'User 4', u'Confirm', u'Site', u'Site', u'Confirm']
于 2012-10-15T18:09:00.093 に答える
4

行自体にリスト内包表記を使用する方が速いと思います。

rows = soup.find('tbody').findAll('tr')

for i in rows[1:]: # the first row is thrown out
    [j['title'] for j in i.findAll('img')]

それはあなたに

['User', 'Confirm', 'Confirm', 'Site', 'Confirm']
['User', 'Confirm', 'Confirm', 'Confirm', 'Confirm']
['User', 'Confirm', 'Confirm', 'Confirm', 'Confirm']
['User', 'Confirm', 'Site', 'Site', 'Confirm']

ネストされたリスト内包表記を使用して、さらに多くのステップを切り取ることができます。

# superpythonic
[[j['title'] for j in i.findAll('img')] for i in rows[1:]]

# all together now, but not so pythonic
[[j['title'] for j in i.findAll('img')] for i in soup.find('tbody').findAll('tr')[1:]]

user#はインデックス番号+ 1であるため、実際にはUser#は必要ありません。

[[j['title'] for j in i.findAll('img') if j['title'] != 'User'] for i in rows[1:]]

しかし、もしあなたが持っている必要があるなら...

for i in xrange(len(users)):
    users[i].append("User " + str(i+1))

ただし、これを行うことを主張する場合namedtupleは、リストの代わりにデータ構造としてを使用します。 namedtuple

from collections import namedtuple
# make these actual non-obfuscated names, not column numbers
User = namedtuple('User', ('num col_1 col_2 col_3 col_4') 

次に、たとえばユーザー1のnamedtupleのインスタンスを作成しuserたら、次のことができます...

>>> user.num
... 1
>>> user.col_1
... 'Confirm'
>>> user.col_2
... 'Confirm'
>>> user.col_3
... 'Site'
>>> user.col_4
... 'Confirm'
于 2012-10-15T20:05:38.020 に答える