Этот код демонстрирует путаницу в области видимости. titles
и links
внутри title_link
являются локальными для этой функции. Когда функция заканчивается, данные исчезают, и к ним нельзя получить доступ из другой области, такой как main. Используйте ключевое слово return
для возврата значений из функций. В этом случае вам нужно будет вернуть пару кортежей titles
и links
, например return titles, links
.
Поскольку функции должны выполнять только одну задачу, необходимость возврата пары показывает, что это возможно. изъян. Такая функция, как title_link
, перегружена и, вероятно, должна представлять собой две отдельные функции: одну для получения заголовков и одну для получения ссылок.
Сказав это, функции здесь кажутся преждевременными абстракциями, поскольку операции могут выполняться непосредственно .
Предлагаемое переписывание:
import pandas as pd
import requests
from bs4 import BeautifulSoup
url = "https://www.gumtree.pl/s-mieszkania-i-domy-sprzedam-i-kupie/warszawa/page-%d/v%dc9073l3200008p%d"
data = {"title": [], "link": []}
for i in range(1, 6):
page = requests.get(url % (i, i, i))
soup = BeautifulSoup(page.content, "html.parser")
titles = soup.find_all("a", class_="href-link tile-title-text")
data["title"].extend([x.next_element for x in titles])
data["link"].extend("https://www.gumtree.pl" + x.get("href") for x in titles)
df = pd.DataFrame(data)
print(df.head(100))
Другие замечания:
i+=1
не требуется; Петли for
автоматически перемещаются вперед в Python. (1,5+1)
более понятен как (1, 6)
. - Значения списков велики, но если они содержат несколько строк, рассмотрите возможность их записи в виде обычных циклов или создания промежуточной переменной или двух.
- Импорт должен быть только в верхней части файла. См. PEP-8 .
list.extend(other_list)
предпочтительнее, чем list = list + other_list
, который является медленным и занимает много памяти, создавая полную копию списка.