2017-07-02 14 views
6

私は現在、Python 3.6でリクエストとBeautifulSoupモジュールを使って練習しようとしています。他の質問と回答の情報を見つけることができないという問題が発生しました。美しいスープはタグを見つけることができません

ページのある時点で、Beuatiful SoupがタグとIDの認識を停止しているようです。私はこのようなページから実況データを取得しようとしています:Chromeでインスペクタを使用して

http://www.pro-football-reference.com/boxscores/201609080den.htm

import requests, bs4 

source_url = 'http://www.pro-football-reference.com/boxscores/201609080den.htm' 
res = requests.get(source_url) 
if '404' in res.url: 
    raise Exception('No data found for this link: '+source_url) 

soup = bs4.BeautifulSoup(res.text,'html.parser') 

#this works 
all_pbp = soup.findAll('div', {'id' : 'all_pbp'}) 
print(len(all_pbp)) 

#this doesn't 
table = soup.findAll('table', {'id' : 'pbp'}) 
print(len(table)) 

、私はテーブルが間違いなく存在していることがわかります。私はまた、HTMLの後半で 'div'や 'tr'に使用しようとしましたが、うまくいかないようです。私は標準の 'html.parser'とlxmlとhtml5libを試しましたが、何も動作していないようです。

ここで何か間違っているのですか、またはHTMLやその書式設定にBeautifulSoupが正しくタグを見つけられないようなことがありますか?私はこの会社(hockey-reference.com、basketball-reference.com)が運営する同様のページで問題にぶつかりましたが、他のサイトでこれらのツールを適切に使用することができました。

HTMLと何か関係がある場合は、そこにこの情報を抽出するのに役立つツールやライブラリがありますか?

は、あなたの助けのために[OK]を BF

+0

そのテーブルから正確にどのように解析しますか? すべてのテーブル?いくつかの列だけ?いくつかの細胞? –

+0

あなたのステートメント 'table = soup.findAll( 'table'、{'id': 'pbp'})'は_not working_ではなく、 'id = pbp'を使って要素を見つけていません。 –

+0

@DmitriyFialkovskiy私は最終的に特定のゲームからの劇のExcelファイルを作成しようとしています。私がそのテーブルでスープをゼロにすることができたら、trとtdタグを使ってテキストを抜き出し、openpyxlを使ってExcelに変換することができると確信しています。私は最終的に私の質問は、bs4がhtmlでタグを見つけられない理由だと思う。 bs4はhtmlのコメントの前にタグを見つけることができますが、コメントは解析に影響しません。そのコメントの後にタグを正確に引き出す方法はありますか? –

答えて

1

BS4は、URLのGETリクエストを実行した後、WebページのJavaScriptを実行することはできません。私は懸念のテーブルがクライアントサイドのJavaScriptから非同期に読み込まれると思います。

結果として、HTMLをスクラップする前に、クライアントサイドのJavaScriptを最初に実行する必要があります。このpostには、これを行う方法が記載されています。

+0

もう一度、ありがとうございました。ドライスクレーパーで遊んだことが助けになりました。私は物事のリストに追加する別の図書館があると思う。 –

0

をありがとう、私が問題だったものです。 コメントを解析しようとしています。通常のhtml要素ではありません。このような場合のために あなたは、このように、BeautifulSoupからCommentを使用する必要があります。

import requests 
from bs4 import BeautifulSoup,Comment 

source_url = 'http://www.pro-football-reference.com/boxscores/201609080den.htm' 
res = requests.get(source_url) 
if '404' in res.url: 
    raise Exception('No data found for this link: '+source_url) 

soup = BeautifulSoup(res.content,'html.parser') 

comments=soup.find_all(string=lambda text:isinstance(text,Comment)) 

for comment in comments: 
    comment=BeautifulSoup(str(comment), 'html.parser') 
    search_play = comment.find('table', {'id':'pbp'}) 
    if search_play: 
     play_to_play=search_play 
+0

@Big Fore、フィードバック?私の答えはどうにか役立つのですか? –

+0

あなたの答えは私の学習プロセスには間違いありませんが、私が持っていた問題の解決策ではありませんでした。私の問題は、コメントの後にタグを見つけることでした。これは、コメントがjavascriptを介してロードされた後、ブラウザで表示されていたHTMLが表示され、リクエストテキストには表示されませんでしたが、解析するためのライブラリがさらに必要でした。あなたの助けをありがとうDmitry –

+0

完全にあなたを理解していないあなたの目的は、そのテキストやタグでコメント自体をキャッチすることです_その後、特定のコメント? –

関連する問題