2017-05-24 26 views
1

フォーラムのWebサイト(ページあたり50行)からテーブルを削るのに問題があります。私のコードは、書かれているように、コンテンツの95%で動作しますが、太字またはイタリック体の行が存在し、完全な結果が得られないときに改行を追加します。BeautifulSoupオブジェクトからタグを削除する

大部分のページには次のようなタグがあります。

<table> 
    <td> 
    content_1 
    </td><td> 
    content_2 
    </td><td> 
    content_3 
    </td> 
    ... 
</table> 

太字またはイタリック体のフレーズが存在する場合は、何らかの理由でランダムタグが追加されますが、タグまで要素数が増えるだけです。

<table> 
    <td> 
    content_1 
    </td><td> 
     <b><i>content_2</b></i> *</table>* 
    </td><td> 
    content_3 
    </td> 
... 
</table> 

このタグがなぜ表示されるのかわかりません(ウェブページ上の要素を調べても表示されません)。

誰もこれに対処する方法について提案はありますか?私はいくつかのアイデアを持っていますが、それらのどれもがまだ解決していません。

  • だけスキップ...かなりまだ働いていないが、少し過剰に思えるし、プログラムを遅くする -

    • 、タグを削除し、beautifulsoupに戻って変換する文字列にbeautifulsoupオブジェクトを変換しますスープと使用pd.read_html - それはまだ働くことを得ていない。

    誰かが別の方法に提案している場合は、それも同様に評価されます。ありがとう!

    編集 - 私は自分のコードを追加したばかりです。メインブロックに3つの例がある場合。最初は結果が得られず、2番目に部分的な結果があり、3番目は完全な結果です。

    def get_page(URL): 
        ''' 
        INPUT: url 
        OUTPUT: pandas dataframe with message board info 
        ''' 
        content = requests.get(URL).content 
        soup = BeautifulSoup(content, "html.parser") 
        rows = list(soup.find('table', id="ctl00_CP1_gv")) 
        table_lst = [] 
        for row in rows[2:-2]: 
         cell_lst = [cell for cell in list(row)[1:5]] 
         table_lst.append(cell_lst) 
        return pd.DataFrame(table_lst) 
    
    if __name__ == '__main__': 
        url1 = "https://investorshub.advfn.com/Cal-Bay-International-Inc-CBYI-5520/?NextStart=35092" 
        url2 = "https://investorshub.advfn.com/Cal-Bay-International-Inc-CBYI-5520/?NextStart=35099" 
        url3 = "https://investorshub.advfn.com/Cal-Bay-International-Inc-CBYI-5520/?NextStart=1000" 
        df1 = get_page(url1) 
        df2 = get_page(url2) 
        df3 = get_page(url3) 
    
  • +0

    「太字またはイタリック体の行がある場合は... ...」ブレークするコードとエラーメッセージがあれば表示してください。 – DyZ

    +0

    お詫び 'break'は、誤った言葉の選択でした。他のページが提供する完全な結果を提供するものではありません。私はサンプルページとして井戸として自分のコードを追加しました... – schustda

    +0

    そのウェブサイトは混沌としています...あなたはそれらのウェブサイトのどの部分を取得しようとしているのかを明確にすることができますか? – Tony

    答えて

    1

    あなたはすでに<b><i>..</b></i>が故障している、したがって、不正なHTMLことに気づいてきたように。 html.parserはジョブを処理できませんでした。私はあなたのテストケースに対してlxmlを試しました。それはうまくいきます。

    soup = BeautifulSoup(content, "lxml") 
    
    +0

    それはそれのように見えます。ありがとうございました!私はいつもhtml.parserをデフォルトにする悪いハビットを持つ傾向があります。 – schustda

    関連する問題