1

1週間ほど前に問題がありました。解決策はクールだと思うので、以前に投稿した質問への回答を待っている間、ここで共有します. テーブル内の列見出しの相対的な位置を知る必要があるため、列見出しを下の行のデータと一致させる方法を知っています。一部のテーブルに、テーブルの最初の行として次の行があることがわかりました

<!-- Table Width Row -->
<TR style="font-size: 1pt" valign="bottom">
<TD width="60%">&nbsp;</TD> <!-- colindex=01 type=maindata -->
<TD width="1%">&nbsp;</TD>  <!-- colindex=02 type=gutter -->
<TD width="1%" align="right">&nbsp;</TD>    <!-- colindex=02 type=lead -->
<TD width="9%" align="right">&nbsp;</TD>    <!-- colindex=02 type=body -->
<TD width="1%" align="left">&nbsp;</TD> <!-- colindex=02 type=hang1 -->

<TD width="3%">&nbsp;</TD>  <!-- colindex=03 type=gutter -->
<TD width="1%" align="right">&nbsp;</TD>    <!-- colindex=03 type=lead -->
<TD width="4%" align="right">&nbsp;</TD>    <!-- colindex=03 type=body -->
<TD width="1%" align="left">&nbsp;</TD> <!-- colindex=03 type=hang1 -->
<TD width="3%">&nbsp;</TD>  <!-- colindex=04 type=gutter -->
<TD width="1%" align="right">&nbsp;</TD>    <!-- colindex=04 type=lead -->

<TD width="4%" align="right">&nbsp;</TD>    <!-- colindex=04 type=body -->
<TD width="1%" align="left">&nbsp;</TD> <!-- colindex=04 type=hang1 -->
<TD width="3%">&nbsp;</TD>  <!-- colindex=05 type=gutter -->
<TD width="1%" align="right">&nbsp;</TD>    <!-- colindex=05 type=lead -->
<TD width="5%" align="right">&nbsp;</TD>    <!-- colindex=05 type=body -->
<TD width="1%" align="left">&nbsp;</TD> <!-- colindex=05 type=hang1 -->

 </TR>

データは type=body の下の列にあるので、これは簡単だろうと思いました。カウントダウンすると、データ行で列 [3、7、11、15] の値を取得する必要があることがわかりました。そこで、次のコードを使用してそれを達成することに着手しました。

indexComment = souptoGetColIndex.findAll(text=re.compile("type=body"))
indexRow=indexComment[0].findParent()
indexCells=indexRow.findAll(text=re.compile("type=body"))
for each in range(len(indexCells)):
    collist.append(tdlist.index(indexCells[each].previousSibling.previousSibling))

私が得たのは collist=[0, 3, 7, 7, 15] でした

7 番目と 11 番目のセルがまったく同じように見えたため、同じインデックス位置が返されたと思います。私はこれに対処する方法を見つけようとしていました.明らかに、それらを異なって見えるようにする必要がありました. そのため、最初に readlines を使用してファイルの各行を読み取り、空白をランダムな整数に変更することで、見た目を変えました。

for each in toGetColIndex:
   newlt.append(each.replace(r"&nbsp;",str(random.randint(1,14567))))

友人は、代わりにこれを使用することでオーバーヘッドを削減できると指摘しました

for each in toGetColIndex:
   newlt.append(each.replace(r"&nbsp;",str(toGetColIndex.index(each))))

それにもかかわらず、これらの各アプローチは、各列のヘッダーの場所の colindex を含むリストを取得し、データ行で使用します。実際のコードでは r"&.nbsp;" を使用しているため、html によって空白が消えていると思われるため、replace 関数に空白がないことに注意してください。ピリオドなし

4

1 に答える 1

1

以下のコードは [3, 7, 11, 15] を生成します。

from BeautifulSoup import BeautifulSoup
from re import compile

soup = BeautifulSoup(
    '''<HTML><BODY>
    <TABLE>
    <TR style="font-size: 1pt" valign="bottom">
    <TD width="60%"> </TD> <!-- colindex=01 type=maindata -->
    <TD width="1%"> </TD>  <!-- colindex=02 type=gutter -->
    <TD width="1%" align="right"> </TD>    <!-- colindex=02 type=lead -->
    <TD width="9%" align="right"> </TD>    <!-- colindex=02 type=body -->
    <TD width="1%" align="left"> </TD> <!-- colindex=02 type=hang1 -->

    <TD width="3%"> </TD>  <!-- colindex=03 type=gutter -->
    <TD width="1%" align="right"> </TD>    <!-- colindex=03 type=lead -->
    <TD width="4%" align="right"> </TD>    <!-- colindex=03 type=body -->
    <TD width="1%" align="left"> </TD> <!-- colindex=03 type=hang1 -->
    <TD width="3%"> </TD>  <!-- colindex=04 type=gutter -->
    <TD width="1%" align="right"> </TD>    <!-- colindex=04 type=lead -->

    <TD width="4%" align="right"> </TD>    <!-- colindex=04 type=body -->
    <TD width="1%" align="left"> </TD> <!-- colindex=04 type=hang1 -->
    <TD width="3%"> </TD>  <!-- colindex=05 type=gutter -->
    <TD width="1%" align="right"> </TD>    <!-- colindex=05 type=lead -->
    <TD width="5%" align="right"> </TD>    <!-- colindex=05 type=body -->
    <TD width="1%" align="left"> </TD> <!-- colindex=05 type=hang1 -->

     </TR>
    </TABLE> </BODY></HTML>'''
)

tables = soup.findAll('table')
matcher = compile('colindex')

def body_cols(row):
    for i, comment in enumerate(row.findAll(text=matcher)):
        if 'type=body' in comment:
            yield i

for table in soup.findAll('table'):
    index_row = table.find('tr')
    print list(body_cols(index_row))
于 2008-10-20T16:13:14.957 に答える