2017-12-19 5 views
1

私の問題はこのanswerに関連しています。BeautifulSoup複数回選択してください

は、私は次のコードを持っている:

import urllib.request 
from bs4 import BeautifulSoup 

time = 0 

html = urllib.request.urlopen("https://www.kramerav.com/de/Product/VM-2N").read() 
html2 = urllib.request.urlopen("https://www.kramerav.com/de/Product/SDIA-IN2-F16").read() 
try: 
    div = str(BeautifulSoup(html).select("div.large-image")[0]) 
    if(str(BeautifulSoup(html).select("div.large-image")[1]) != ""): 
     div += str(BeautifulSoup(html).select("div.large-image")[1]) 
    time = time + 1 
except IndexError: 
    div = "" 
    time = time + 1 
finally: 
    print(str(time) + div) 

変数HTMLのサイトは "大画像" という名前の2 DIV-クラスがあります。変数html2のサイトは1つしかありません。 htmlでは、プログラムは意図したとおりに動作します。しかし、私がhtml2に切り替えると、変数divは完全に空になります。

何も保存するのではなく、1つのdivクラスを保存します。どのように私はこれを達成することができますか?

+0

予想される出力は?あなたは、一度に2ページですべての画像を利用できるようになっていますか? – SIM

答えて

1

変数divは完全に空になります。

これは、エラーハンドラが空の文字列を割り当てたからです。

このように、添え字、条件文、およびハンドラは使用しないでください。 select()の結果をforで繰り返し処理し、結果リスト(または文字列)を構築するのは自然です。

また、soup = BeautifulSoup(html)は、潜在的に長いWebページを慎重に解析するため、かなり高価な操作になる可能性があります。あなたがHTMLフラグメントのリストを構築することができることで、:

images = [] 
    for image in soup.select('div.large-image'): 
     images.append(image) 
をして、取得:

あなたが好きリスト内包じゃない何らかの理由で
images = [image 
       for image in soup.select('div.large-image')] 

た場合、または、あなたは同等に書くことができます必要なHTMLはdiv = '\n'.join(images)です。

+0

こんにちは、ありがとうございました。私は 'select = BeautifulSoup(html).select(" div.large-image ")'に短縮しました。これでselect [index]を使うことができます。 しかしforループを使用するにはどうすればよいですか? 'for i in select [i]:'私の推測だろうか、そこから何をするのか分からない。 – dun

+2

@dunあなたは 'for select in item 'を意味しますか? 'select'はリストなので、他のリストと同じように使います。 – furas

+0

はい私はそれのようなものを意味しました。申し訳ありませんが、私のプログラミングスキルはかなり低いです。 私がselect: div = str(i)で 'for i 'を使うと、2番目のdivだけがString divに保存されます。どうすれば両方を保存できますか? – dun

0

あなたはまた、forループ内で直接ファイルに書き込むことができますforループ

all_divs = soup.select("div.large-image") 

    for item in all_divs: 
     div += str(item) 
     time += 1 

またはjoin()

time = len(all_divs) 

    div = ''.join(str(item) for item in all_divs) 

を使用して内部のすべての項目を連結することができますし、

for item in all_divs: 
     csv_writer.writerow([str(item).strip()]) 
     time += 1 
行してもらいます

作業例

import urllib.request 
from bs4 import BeautifulSoup 
import csv 

div = "" 
time = 0 

f = open('output.csv', 'w') 
csv_writer = csv.writer(f) 

all_urls = [ 
    "https://www.kramerav.com/de/Product/VM-2N", 
    "https://www.kramerav.com/de/Product/SDIA-IN2-F16", 
] 

for url in all_urls: 
    print('url:', url) 

    html = urllib.request.urlopen(url).read() 

    try: 
     soup = BeautifulSoup(html) 
     all_divs = soup.select("div.large-image") 

     for item in all_divs: 
      div += str(item) 
      time += 1 

     # or  
     time = len(all_divs) 
     div = ''.join(str(item) for item in all_divs) 

     # or 

     for item in all_divs: 
      #div += str(item) 
      #time += 1 
      csv_writer.writerow([time, str(item).strip()]) 

    except IndexError as ex: 
     print('Error:', ex) 
     time += 1 
    finally: 
     print(time, div) 

f.close()   
関連する問題