2017-07-15 13 views
0

問題を適切に語る方法がわかりません。Python - beautifulSoupが繰り返しブロックを反復できない

私は

div(unique-class) 
|-a 
|-h4 
|-div(class-a) 
|-div(class-b) 
|-div(class-c) 
|-p 

その他、各種のものと同様のツリーで、HTML文書を解析しようとしています、それが続いています。私は必要なアイテムをいくつかリストアップしました。それは1つのdiv内にすべて存在する兄弟階層の多くです。

私はこの数時間、BeautifulSoupでかなり作業していました。このサンプルでは、​​最終的に、私が解析しようとしているものの作業用バージョン(ベータ版)を持っています。

from bs4 import BeautifulSoup 
import urllib2 
import csv 
file = "C:\\Python27\\demo.html" 

soup = BeautifulSoup (open(file), 'html.parser') 
#(page, 'html.parser') 

#Let's pull prices 
names = [] 
pricing = [] 
discounts = [] 

for name in soup.find_all('div', attrs={'class': 'unique_class'}): 
names.append(name.h4.text) 
for price in soup.find_all('div', attrs={'class': 'class-b'}): 
pricing.append(price.text) 
for discount in soup.find_all('div', attrs={'class': 'class-a'}): 
discounts.append(discount.text) 
ofile = open('output2.csv','wb') 
fieldname = ['name', 'discountPrice', 'originalPrice'] 
writer = csv.DictWriter(ofile, fieldnames = fieldname) 
writer.writeheader() 
for i in range(len(names)): 
print (names[i], pricing[i], discounts[i]) 

writer.writerow({'name': names[i], 'discountPrice':pricing[i], 'originalPrice': discounts[i]}) 
ofile.close() 

これは、上から下への反復とそれぞれの別個の配列への追加という意味です。問題は、私が反復処理をしていて、30,000アイテムと言えば、ウェブサイトはそれ自体を変更できるということです(私たちはJSフレームワークでScoreBoardアプリを言うでしょう).2回目の繰り返しになるまでには、かわった。 (私がこれをタイプするとき、BSは負荷の時にウェブサイトを「キャッチ」するので、このシナリオは実際にはより多くの変数を必要とすることに気づくが、その点は依然として立っていると思う)BS4を使っていましたが、私がそれをしたとき、指定していない項目を取り込み始めました。私は兄弟に「クラス」を適用できなかったからです。

更新

unique-classの下で、私は必要な3人の子供を見つけるために、ループ内でループをやろうとしたとき、私は奨励し、追加の問題は、私はすべての名前のためにリストされ最初の価格で終わるだろうでした。

アップデート -

<div class="unique_class"> 
    <h4>World</h4> 
    <div class="class_b">$1.99</div> 
    <div class="class_a">$1.99</div> 
</div> 
<div class="unique_class"> 
    <h4>World2</h4> 
    <div class="class_b">$2.99</div> 
    <div class="class_a">$2.99</div> 
</div> 
<div class="unique_class"> 
    <h4>World3</h4> 
    <div class="class_b">$3.99</div> 
    <div class="class_a">$3.99</div> 
</div> 
<div class="unique_class"> 
    <h4>World4</h4> 
    <div class="class_b">$4.99</div> 
    <div class="class_a">$3.99</div> 
</div> 

サンプルHTMLを追加する私はまた、修正を発見し、最適化することが答えを提出した - のサイトには、あなたがデータをこすりするために探している場合CodeReview

+0

'(open(file)...'の代わりに '(open(url)...'を呼び出そうとしたことがありますか? 'soup'変数は定義された後で変更してはいけません---オブジェクトBeautifulSoup – snapcrack

+0

私はあなたが解析したいと思う実際のHTMLを調べることができないので、少なくとも多少難しい質問ですが、これは動作するコードではありますが、私は 'soup = BeautifulSoup(open –

+0

@BillBell完全に公正なポイント - 私はhtml.parserを入手するために、たくさんの操作をしなければなりませんでした。添えられたサンプルと、私が持っているバンドル版のコードレビューリンク。 – DNorthrup

答えて

1

に位置from JSを使用している場合は、セレンを使用してpage_sourceメソッドを使用して、読み込まれたJSのページのスナップショットを抽出し、BSにロードすることができます。あなたはセレンで待つためにイベントを指定することができますアップロードするために、他のJSのイベントを待ちたい場合

from selenium import webdriver 
driver = webdriver.PhantomJS() 
driver.get(<url>) 
page = driver.page_source 

その後、あなたはJSロード「ページ」 を解析するためにBSを使用することができます。

関連する問題