2017-02-17 6 views
0

내가 파이썬 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을 인쇄 할 수는 없습니다.

불과 몇 달 전부터 파이썬을 배우고 있었으므로이 문제에 대해 많은 도움을 주시기 바랍니다!

답변

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

Sebastian Opał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 

또한 HTML 요소를 추출하는 XPath에 또는 CSS 선택기를 사용하는 것이 좋습니다 것 : 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