2017-06-26 10 views
0

私はBeautifulSoupを使用してウェブサイトからデータをスクレイピングしています。何らかの理由で、span要素間のテキストを印刷する方法を見つけることができないようです。ここに私が走っていることがあります。掻き取り<span>フローテキスト</span>とBeautifulSoupとurllib

data = """ <div class="grouping"> 
    <div class="a1 left" style="width:20px;">Text</div> 
    <div class="a2 left" style="width:30px;"><span 
    id="target_0">Data1</span> 
    </div> 
    <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2 
    </span></div> 
    <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3 
    </span</div> 
</div> 
""" 

私の究極の目標は、各エントリのリスト[「テキスト」、「データ1」、「データ2」を]印刷することがになります。しかし、今、私はpythonとurllibを得ることに問題があります。

import urllib 
from bs4 import BeautifulSoup 

url = 'http://target.com' 
html = urllib.urlopen(url).read() 
soup = BeautifulSoup(html, "lxml") 

Search_List = [0,4,5] # list of Target IDs to scrape 

for i in Search_List: 
    h = str(i) 
    root = 'target_' + h 
    taggr = soup.find("span", { "id" : root }) 
    print taggr, ", ", taggr.text 

私はurllibは使用し、この生成します:ここで私が実行しているものですが

<span id="target_0"></span>, 
<span id="target_4"></span>, 
<span id="target_5"></span>, 

を、私はまた、htmlファイルをダウンロードして、私はダウンロードしたファイルを解析する際には、(この出力を生成します私が欲しいもの):

誰かが私に説明してくれた理由は、結果が出ないのですか?

+0

あなたが解析したいサイトの実際のURLを教えてください。 –

答えて

0

使用このコード:

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

your_data = list() 

for line in soup.findAll('span', attrs={'id': 'target_0'}): 
    your_data.append(line.text) 


... 

同様にあなたがからデータを抽出し、CSVファイルにyour_dataリストを記述する必要があるすべてのclass attributesを追加します。これがうまくいかない場合、これが役立つことを願っています。お知らせ下さい。

+0

ありがとう!これはファーストクラス(ではなく)で動作しますが、他の2つでは動作しません。しかし、Webページを.htmlファイルにダウンロードしてそのファイルを解析すると、この問題は発生しません。それがなぜ起こったのか考えていますか? それ以外の場合は、私はdivの子供を解析し、そこを通過することができると思いますよね? – Naruto

+0

'data1'テキストのコードを更新しました。これを最初に試してください@Naruto – WarLock

0

はあなたが示されているソースHTMLに基づいてリストを作成するには、次のアプローチを使用することができます。

from bs4 import BeautifulSoup 

data = """ 
<div class="grouping"> 
    <div class="a1 left" style="width:20px;">Text0</div> 
    <div class="a2 left" style="width:30px;"><span id="target_0">Data1</span></div> 
    <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div> 
    <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div> 
</div> 

<div class="grouping"> 
    <div class="a1 left" style="width:20px;">Text2</div> 
    <div class="a2 left" style="width:30px;"><span id="target_2">Data1</span></div> 
    <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div> 
    <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div> 
</div> 

<div class="grouping"> 
    <div class="a1 left" style="width:20px;">Text4</div> 
    <div class="a2 left" style="width:30px;"><span id="target_4">Data1</span></div> 
    <div class="a3 left" style="width:45px;"><span id="div_target_0">Data2</span></div> 
    <div class="a4 left" style="width:32px;"><span id="reg_target_0">Data3</span></div> 
</div> 
""" 

soup = BeautifulSoup(data, "lxml") 

search_ids = [0, 4, 5] # list of Target IDs to scrape 

for i in search_ids: 
    span = soup.find("span", id='target_{}'.format(i)) 

    if span: 
     grouping = span.parent.parent 
     print list(grouping.stripped_strings)[:-1]  # -1 to remove "Data3" 

の例では、少しそれはIDが04を見つける表示するように変更されました。あなたが戻ってあなたのURLから取得しているHTMLが、それと異なっている場合は、その後、(必要なデータが完全に不足しているIE)ブラウザからソースを表示してみると、

[u'Text0', u'Data1', u'Data2'] 
[u'Text4', u'Data1', u'Data2'] 

注:これは、次の出力が表示されますブラウザに接続してHTMLを抽出するには、seleniumなどのソリューションを使用する必要があります。これは、この場合、HTMLがJavascript経由でローカルに生成されている可能性があり、urllibにJavascriptプロセッサがないためです。

+0

HTMLやCSSをチェックして、データがjavascriptで計算されているかどうかを確認する方法はありますか?それとも、JSを見る必要がありますか? Google Chromeのinspect要素を使ってHTML/CSSを読みます。要素を調べる優れたアプリはありますか?私が言ったように、データは "要素を調べる"上に来ると、私はhtmlファイルをダウンロードし、BSでそれを解析したが、urllibはウェブサイトからそれを読み込むことができないようだ。 – Naruto

+0

ブラウザに表示されるHTMLソースが、urllibやリクエストライブラリから返されたものを表示したソースと一致しない場合は、おそらくJavascriptです。セレンベースのソリューションは、スクリプトに数行追加するだけです。 –

関連する問題