2016-07-17 1 views
1

以下の値としてヘッダーなどthead、およびtbodyを持つ、私はどのように私は、これらすべての情報をこすりするPandas.read_htmlを使用しないのpythonセレン掻き取りTBODY

<div class="data-point-container section-break"> 
    # some other HTML div classes here which I don't need 
    <table class data-bind="showHidden: isData"> 
      <!-- ko foreach : sections --> 
     <thead>...</thead> 
     <tbody>...</tbody> 
     <thead>...</thead> 
     <tbody>...</tbody> 
     <thead>...</thead> 
     <tbody>...</tbody> 
     <thead>...</thead> 
     <tbody>...</tbody> 
     <thead>...</thead> 
     <tbody>...</tbody> 
      <!-- /ko --> 
    </table> 
</div> 

をこすりしようとしているHTMLコードのですか?

EDIT:

これは私がこすりしようとしている、とのデータがパンダDATAFRAMEに抽出しているサイトです。 Link here

+0

これは実際には仕様に違反しているので、 'table'に' thead'や 'tfoot'要素を複数持つことはできません:http://stackoverflow.com/a/16155425/771848。 – alecxe

+0

完全な表を投稿できますか? - 少なくともいくつかの 'thead'と' tbody'が展開されました。 – alecxe

+0

こんにちはalecxe、私は掻き寄せようとしているもののリンクを追加しました。 stackoverflowに置くにはあまりにも多くのHTMLコードがありますので、私はどのデータを取得しようとしているのかを表示するほうがよいかもしれないと考えました。 –

答えて

1

厳密に言えば、tableエレメント仕様によるテーブル当たりone should not have more than one thead elementです。それでもtbody構造を相当に続いて、このtheadをお持ちの場合は

、私は繰り返しそれを解析します - このようなすべての構造をそれ自身のデータフレームに。

実施例:

import pandas as pd 
from bs4 import BeautifulSoup 

data = """ 
<div class="data-point-container section-break"> 
    <table class data-bind="showHidden: isData"> 

     <thead> 
      <tr><th>Customer</th><th>Order</th><th>Month</th></tr> 
     </thead> 
     <tbody> 
      <tr><td>Customer 1</td><td>#1</td><td>January</td></tr> 
      <tr><td>Customer 2</td><td>#2</td><td>April</td></tr> 
      <tr><td>Customer 3</td><td>#3</td><td>March</td></tr> 
     </tbody> 

     <thead> 
      <tr><th>Customer</th></tr> 
     </thead> 
     <tbody> 
      <tr><td>Customer 4</td></tr> 
      <tr><td>Customer 5</td></tr> 
      <tr><td>Customer 6</td></tr> 
     </tbody> 

    </table> 
</div> 
""" 

soup = BeautifulSoup(data, "html.parser") 
for thead in soup.select(".data-point-container table thead"): 
    tbody = thead.find_next_sibling("tbody") 

    table = "<table>%s</table>" % (str(thead) + str(tbody)) 

    df = pd.read_html(str(table))[0] 
    print(df) 
    print("-----") 

プリント2つのデータフレーム - のための1つ毎にTHEADサンプル入力HTMLで& TBODY:私は意図的に、ヘッダとデータの数を作った

 Customer Order Month 
0 Customer 1 #1 January 
1 Customer 2 #2 April 
2 Customer 3 #3 March 
----- 
    Customer 
0 Customer 4 
1 Customer 5 
2 Customer 6 
----- 

注デモンストレーションの目的で各ブロックごとに異なるセル。

+0

私の質問を更新しました。これを手伝ってくれてありがとう! –

+0

@確かに、とにかくこの解決策を試してください。そのまま動作するかもしれません。 – alecxe

+0

はい、私はそれを試したことがあり、それは魅力のように働いた!あなたは伝説です! :) –

関連する問題