2015-03-10 3 views
0

Я сделал фрагмент кода, который отлично работает с печатью, но не работает, когда я сделал его функцию и попытался вернуть его. Вот исходный код:Функция не будет петля

import requests 
from bs4 import BeautifulSoup 
import wikipedia 

source_code = requests.get('http://en.wikipedia.org/wiki/IBM') 
plain_text = source_code.text 
plain_text = plain_text[:plain_text.find('id="toc"')] 
soup = BeautifulSoup(plain_text) 

for div in soup.findAll('a'): 
    if div.parent.name == 'p': 
     href = div.get('href') 
     href = href.replace(',', '') 
     href = href.replace('-', ' ') 
     href = href.replace('(', '') 
     href = href.replace(')', '') 
     href = href.replace('_', ' ') 

     print (href[6:]) 
     href = href.replace(' ', '_') 
     href = href.replace('^', '') 
     try: 
      print(wikipedia.summary(href[6:])) 
     except wikipedia.exceptions.DisambiguationError as e: 
      print (e.options) 

, который форматирует текст и дает мне название и резюме страницы википедии и все резюме ссылки в исходном резюме, что именно то, что я хочу. К сожалению, это должно быть частью более крупной программы, и поэтому я сделал функцию (возможно, я должен делать это по-другому?) это выглядит следующим образом:

import requests 
from bs4 import BeautifulSoup 
import wikipedia 

source_code = requests.get('http://en.wikipedia.org/wiki/IBM') 
plain_text = source_code.text 
plain_text = plain_text[:plain_text.find('id="toc"')] 
soup = BeautifulSoup(plain_text) 

def ELS(): 
    for div in soup.findAll('a'): 
     if div.parent.name == 'p': 
      href = div.get('href') 
      href = href.replace(',', '') 
      href = href.replace('-', ' ') 
      href = href.replace('(', '') 
      href = href.replace(')', '') 
      href = href.replace('_', ' ') 

      return href[6:] 
      href = href.replace(' ', '_') 
      href = href.replace('^', '') 
      try: 
       return wikipedia.summary(href[6:]) 
      except wikipedia.exceptions.DisambiguationError as e: 
       return e.options 

print (ELS()) 

, но по какой-то причине, он не цикл и просто печатает первый заголовок, а затем ломается, может быть, это легкая проблема, и только что-то я пропустил

+3

При использовании 'return', функция возвращает немедленно, поэтому цикл заканчивается. – Barmar

+0

Не возвращайтесь внутри цикла, объедините значение в строку результата. Верните эту строку после завершения цикла. – Barmar

+0

Okey, подумал, что это может быть что-то вроде этого, спасибо :) –

ответ

0

Вы возвращаетесь из своей функции, поэтому ломаете петлю. Вам нужно добавить результаты поиска в список или в dict и вернуть его после вашего цикла.

1

return сразу же выходит из функции.

Сбор информации в список и вернуться, что:

def ELS(): 
    results = [] 
    for div in soup.findAll('a'): 
     if div.parent.name == 'p': 
      href = div.get('href') 
      href = href.replace(',', '') 
      href = href.replace('-', ' ') 
      href = href.replace('(', '') 
      href = href.replace(')', '') 
      href = href.replace('_', ' ') 

      href = href.replace(' ', '_') 
      href = href.replace('^', '') 
      try: 
       results.append((href[6:], wikipedia.summary(href[6:]))) 
      except wikipedia.exceptions.DisambiguationError as e: 
       results.append((href[6:], e.options)) 
    return results 

Вы можете затем цикл по результатам; каждая запись представляет собой кортеж с обработанным значением href и значением wikipedia.summary() или исключением e.options. Это позволяет вам повторно использовать эту информацию в другом коде.

+0

Я попытался с: summaryList = [] (код) попробовать: summaryList.append (wikipedia.summary (HREF [6:])) кроме wikipedia.exceptions.DisambiguationError как е: summaryList. append (e.options) return summaryList –

+0

Не уверен, что это намеренно, но поведение немного отличается от кода OP, потому что вы добавляете 'href [6:]' после двух последних замен. – zehnpaard

+0

Я попытался с добавить или изменить: summaryList = [] попытка: summaryList.append (wikipedia.summary (HREF [6:])) кроме wikipedia.exceptions.DisambiguationError как е: summaryList.append (е .Options) возврата summaryList ошибки: File..worder.py "строка 102, в WTD() File..worder.py", линии 69, в WTD Textfile.write (repr (ELS()) + '\ n') Файл .. \ cp1252.py ", строка 19, в кодировке return codecs.charmap_encode (вход, self.errors, encoding_table) [0] UnicodeEncodeError: ' charmap 'не может кодировать символ' \ u03c4 'в позиции 11342: символьные карты на

1

Вы просто заменяете печать с возвратом, и ваше поведение функции теперь имеет проблему, так как функция завершает свое выполнение при вызове команды return.

Попробуйте что-то вроде этого:

def ELS(): 
    output = [] 
    for div in soup.findAll('a'): 
     if div.parent.name == 'p': 
      href = div.get('href') 
      href = href.replace(',', '') 
      href = href.replace('-', ' ') 
      href = href.replace('(', '') 
      href = href.replace(')', '') 
      href = href.replace('_', ' ') 

      output.append(href[6:]) 
      href = href.replace(' ', '_') 
      href = href.replace('^', '') 
      try: 
       output.append(wikipedia.summary(href[6:])) 
      except wikipedia.exceptions.DisambiguationError as e: 
       output.append(e.options) 

    return "\n".join(output) 
Смежные вопросы