問題を適切に語る方法がわかりません。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
'(open(file)...'の代わりに '(open(url)...'を呼び出そうとしたことがありますか? 'soup'変数は定義された後で変更してはいけません---オブジェクトBeautifulSoup – snapcrack
私はあなたが解析したいと思う実際のHTMLを調べることができないので、少なくとも多少難しい質問ですが、これは動作するコードではありますが、私は 'soup = BeautifulSoup(open –
@BillBell完全に公正なポイント - 私はhtml.parserを入手するために、たくさんの操作をしなければなりませんでした。添えられたサンプルと、私が持っているバンドル版のコードレビューリンク。 – DNorthrup