2017-02-17 5 views
0

私は、Python 3.5を使用して(同じウェブサイトから)URLのリストをこすりしようとしているのリストをスクレーピング:は、コードをURLの

import urllib.request 
from bs4 import BeautifulSoup 



url_list = ['URL1', 
      'URL2','URL3] 

def soup(): 
    for url in url_list: 
     sauce = urllib.request.urlopen(url) 
     for things in sauce: 
      soup_maker = BeautifulSoup(things, 'html.parser') 
      return soup_maker 

# Scraping 
def getPropNames(): 
    for propName in soup.findAll('div', class_="property-cta"): 
     for h1 in propName.findAll('h1'): 
      print(h1.text) 

def getPrice(): 
    for price in soup.findAll('p', class_="room-price"): 
     print(price.text) 

def getRoom(): 
    for theRoom in soup.findAll('div', class_="featured-item-inner"): 
     for h5 in theRoom.findAll('h5'): 
      print(h5.text) 


for soups in soup(): 
    getPropNames() 
    getPrice() 
    getRoom() 

をこれまでのところ、私はスープを印刷する場合、propNamesを取得し、 getPriceまたはgetRoomが動作するようです。しかし、私はそれが各URLを通過し、getPropNames、getPrice、getRoomを印刷するように見えることはできません。

Pythonを数ヶ月しか学習していないので、これでいくつかの助けに感謝します!

答えて

0

はちょうどこのコードは何をすべきかを考える:

def soup(): 
    for url in url_list: 
     sauce = urllib.request.urlopen(url) 
     for things in sauce: 
      soup_maker = BeautifulSoup(things, 'html.parser') 
      return soup_maker 

は、私はあなたに例を示しましょう:

def soup2(): 
    for url in url_list: 
     print(url) 
     for thing in ['a', 'b', 'c']: 
      print(url, thing) 
      maker = 2 * thing 
      return maker 

そしてurl_list = ['one', 'two', 'three']のための出力は、次のとおりです。

one 
('one', 'a') 

は、あなたが今見てください?何が起こっている?

基本的にスープ関数は最初に戻りますreturn - 任意のリストを返しません。最初BeautifulSoupのみ - あなたはそうコードを変更

:)これは反復可能であることを幸運(かない)は次のとおりです。

def soup3(): 
    soups = [] 
    for url in url_list: 
     print(url) 
     for thing in ['a', 'b', 'c']: 
      print(url, thing) 
      maker = 2 * thing 
      soups.append(maker) 
    return soups 

そして、出力は次のようになります。

one 
('one', 'a') 
('one', 'b') 
('one', 'c') 
two 
('two', 'a') 
('two', 'b') 
('two', 'c') 
three 
('three', 'a') 
('three', 'b') 
('three', 'c') 

しかし、私がいることを信じていますこれも動作しません:)ちょうどソースによって返されるのは不思議です:sauce = urllib.request.urlopen(url)実際にあなたのコードは反復しています:for things in sauce - thingsの意味です。

ハッピーコーディング。

+0

SebastianOpałczyńskiのおかげで、私はそれを取り上げ、その周りに頭を浮かべて、結果を知ってもらいましょう! – Maverick

0

get*の各関数では、グローバル変数soupが正しく設定されていません。たとえそうであったとしても、それは良いアプローチではありません。例えば、代わりにsoup関数の引数を作る:第二に

def getRoom(soup): 
    for theRoom in soup.findAll('div', class_="featured-item-inner"): 
     for h5 in theRoom.findAll('h5'): 
      print(h5.text) 

for soup in soups(): 
    getPropNames(soup) 
    getPrice(soup) 
    getRoom(soup) 

、あなたは発電機にそれを回すためにsoup()代わりのreturnからyieldをやってされている必要があります。それ以外の場合は、BeautifulSoupオブジェクトのリストを返す必要があります。

def soups(): 
    for url in url_list: 
     sauce = urllib.request.urlopen(url) 
     for things in sauce: 
      soup_maker = BeautifulSoup(things, 'html.parser') 
      yield soup_maker 

また、XPathまたはCSSセレクタを使用してHTML要素:https://stackoverflow.com/a/11466033/2997179を抽出することをおすすめします。

+0

Martin Valgurさん、ありがとうございました。私はXpath/CSSを調べます。あなたの提案を適用すると、次のエラーメッセージが表示されます。AttributeError: 'function'オブジェクトに属性がありません 'findAll - 任意のアイデアですか? – Maverick

+1

すべての関数に 'soup'パラメータを追加しましたか?また、 'soup()'関数の名前を 'soups()'に変更することをお勧めします。 –

+0

ありがとうございました、私は間違っていた!しかし、それはgetPriceに対してのみ機能するようです。他の2人は何も返さない?奇妙なことに、私が最初にこれらの機能を書いたとき、私は1つのURLを使用していました。 – Maverick

関連する問題