2017-08-02 10 views
0

私は、オンラインプロットの軸とそれに関連付けられているテキストの色などのいくつかの機能をスクラップしようとしていますが、スクレイピングをほとんど使用しないので、 。これはおそらく、定期的にスクレーパーを使用する誰にとっても簡単な修正です。ここに私のコードは次のとおりです。ウェブのスクラップネストされたテキスト機能

from bs4 import BeautifulSoup 
import requests 

def get_IPF_transcriptome_groups(): 

url = "https://research.cchmc.org/pbge/lunggens/lungDisease/celltype_IPF.html?cid=1" 
r = requests.get(url) 
data=r.text 
soup = BeautifulSoup(data) 


for d in soup.find('div', attrs={'id':'wrapper'}).find(
     'div', attrs={'class':'content'}).find(
       'div', attrs={'id':'ResPanel'}).find(
         'table', attrs={'id':'maintable'}).find(
           'tbody'): 
    print(d) 

私はエラーを取得する:

'tbody'): 

    TypeError: 'NoneType' object is not iterable 

私はコードはテーブル本体を介して取得することができないと思います。

<tspan style="fill:#006600;font-size:7px;">CC002_33_N709_S503_C10</tspan> 

:私が解析しているよ実際のテキストは、「DIV」、「TD」、「TR」、「G」、などとfolowingのように見えるなど、いくつかの他のタグによってこのことを少し深く埋め込まれた部分れますここで 'CC002_33_N709_S503_C10'はサンプル参照番号で、 '#006600'は色です。このような540行(私は考える)があります。誰かが助けることができれば本当に素晴らしいだろうか?多くのおかげで

ウダイからの応答に基づいて編集:提案のための

おかげで、私はそれに「findAllの」構築されており、次のピースを取得するために、インデックスを使用しました。この提案のhereは、 'tbody'タグがソースコードの一部でない可能性があるため、このタグを削除すると述べています。ちょうど 'tspan'を追加するだけで私が必要なものを返すようではありません。ここに私の更新されたコードがあります:

for d in soup.find('div', attrs={'id':'wrapper'}).find(
     'div', attrs={'class':'content'}).find(
       'div', attrs={'id':'ResPanel'}).find(
         'table', attrs={'id':'maintable'}).findAll(
           'tr')[2].findAll('td')[0].find('div', attrs={'id':'sigheatmapcontainer'}): 
             print(d) 

これ以上の提案は本当に役に立ちますか?

+0

のようなエラー 'TypeError例外場合:「NoneType」オブジェクトがないiterable'は最終返すオブジェクトが(' '(「TBODY」)を見つける。)ループのための**を実行するためのリストではないことを言います**。 'find_all( 'tbody')'を実行してテーブルの内容を取得してください。 –

+0

コードは 'sigheatmapcontainer'にクラッシュすることなく実行されますが、空であるように見えますし、次のdivを見つけようとすると:.find( TypeErrorを返します: 'NoneType'オブジェクトは反復不可能です – user3062260

答えて

2

JavaScriptによるPOSTリクエストを持つ別のURLから、必要なデータを取得します。 (このWebページページのソース(HTML)にはなく、Dryscrapeを使用してレンダリングもしません)。これはJSONで返されます。次のコードはすべてのデータを取得します。どのようにデータを解釈するかは別の問題ですが、おそらくあなたは私よりよく知っています。

from bs4 import BeautifulSoup 
import requests 
import json 
# Fetch the data. 
url = "https://research.cchmc.org/pbge/lunggens/celltypeIPF" 
r = requests.post(url, data = {'id':'1'}) 
data=r.text 
soup = BeautifulSoup(data, "lxml") 
d = soup.find('p') 
# now you have the json containing all the data. 
jn = json.loads(d.text) 
print(json.dumps(jn, indent=2)) 

きれいに印刷された生データを出力します。

JSONを必要な方法で解析できます。あなたパンダ

from pandas.io.json import json_normalize 
import pandas as pd 
... 
df = pd.DataFrame(json_normalize(jn)) 
+0

これについてのあなたの洞察をお寄せいただきありがとうございます。そのデータは間違いなく解析されています。いくつかのコードを少し説明してもらえますか?たとえば、「requests.post(url、data = {'id': '1'})」は、当初使用していた「requests.get(url)」とは異なりますか?おそらくこれはデータを形式のような形式に構造化するでしょうか?また、JavaScriptによるPOSTリクエストで別のURLからデータが取得されたことをどのように伝えることができますか?これを示すhtmlには何かがありますか?最後に。テキストの色がx軸を横切って変化するので、「df ['celltypecnt'] [0]」のデータによって何らかの形で定義されていると思いますが、わかりません。 – user3062260

+0

元のURLにクエリー文字列がありますか?cid = 1 JavaScriptが{'id': '1'}でPOSTリクエストを送信しました。はい、POSTデータはdictのような構造ですが、HTTPリクエストにあります。私はPOSTの要求を見つけるために何が起こっていたのかを見るために "Live Headers"でリクエストを調べました。何らかの形でそれを相関させる必要があるデータを解釈することはできません。また、X軸の色が何であるかわからないように、レンダリングするJavaScriptを調べることもできません。 –

+0

おかげさまで、ありがとうございました。クエリ文字列とライブヘッダーをもう少し読み上げていきます。 – user3062260

関連する問題