Я абсолютный новичок, но мне удалось создать рабочий сценарий из некоторых существующих сценариев и руководств. Я хотел бы иметь только одно, но, к сожалению, не могу этого сделать.
Пока я получаю данные с веб-сайта, например "http://www.example.com/01536496/.../". Теперь у меня есть список (.csv или .txt) со многими другими числами в первом столбце (или в txt-файле каждое число в новой строке). Теперь я хочу очистить веб-данные для всех чисел в списке, таких как «http://www.example.com/No_1/.../», «http://www.example.com/No_2/.../» и так далее.
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import datetime
my_url = 'http://www.example.com/104289633/.../'
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
...
Обновлять
Например, у меня есть файл numbers.txt с: 05543486 3468169 36189994
Теперь я хочу поместить каждое число в URL-адрес ...
Пожалуйста, кто-нибудь может мне помочь. Я буду очень признателен.
Обновлять
После попытки использовать код Андерссона ...
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
import datetime
# Get list of numbers
with open("numbers.txt") as f:
content = f.read()
numbers = content.split()
# Handle each URL in a loop
for number in numbers:
my_url = 'https://www.immobilienscout24.de/expose/%s#/' %number
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
print(my_url)
page_soup = soup(page_html, "html.parser")
containers = page_soup.find_all("div", {"class":"grid-item padding-desk-right-xl desk-two-thirds lap-one-whole desk-column-left flex-item palm--flex__order--1 lap--flex__order--1"})
filename = "results_"+current_datetime+".csv"
f = open(filename, "w")
headers = "titel##adresse##criteria##preis##energie##beschreibung##ausstattung##lage\n"
f.write(headers)
...
f.write(titel + "##" + adresse + "##" + criteria.replace(" ", "; ") + "##" + preis.replace(" ", "; ") + "##" + energie.replace(" ", "; ") + "##" + beschreibung.replace("\n", " ") + "##" + ausstattung.replace("\n", " ") + "##" + lage.replace("\n", " ") + "\n")
f.close()
Например, у меня есть файл numbers.txt с: 05543486 3468169 36189994 Теперь я хочу поместить каждое число в URL-адрес ...






Вы можете создать функцию, которая запускает цикл for и обновляет URL-адрес на каждой итерации цикла. В качестве аргумента можно передать список чисел. Например:
def scrape(numbers):
for num in numbers:
my_url = 'http://www.example.com/No_' + str(num) + '/.../'
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
numbers_list = [1, 2, 3, 4, 5]
scrape(numbers_list)
Да, я искал что-то подобное, но цифры - это некоторые конкретные числа из внешнего файла .txt или .csv. Думаю, вместо numbers_list = [1, 2, 3, 4, 5] мне нужно открыть и прочитать файл? Но как?
Вы можете добиться этого, добавив числа в конце вашего URL-адреса с помощью базового цикла for? Я не уверен, что это то, что вам нужно.
...
with open('yourFile', 'r') as numbersFile:
nums = numbers.readlines()
for num in nums:
url = "http://www.example.com/No_" + num + "/.../"
# do what you want to do with the url...
Да, но я хочу указать конкретные числа из внешнего файла. Каждое число в строке файла.
@JuliGoe отредактировал код, на этот вопрос, вероятно, уже есть ответ, вам нужно его поискать.
Вы можете использовать приведенный ниже код:
# Get list of numbers
with open("/path/to/numbers.txt") as f:
content = f.read()
numbers = content.split()
# Handle each URL in a loop
for number in numbers:
url = 'http://www.example.com/%s' % number
# Do something with url
Спасибо, но работает только для первого числа в файле. Мне кажется, мне нужно сделать цикл (?), Но (мне очень жаль, что я не упомянул об этом в первый раз), как я могу это сделать? я сказал, я абсолютно новичок: - /
Еще петли? Зачем? С моим кодом вы сможете перебирать все числа ... Проверьте, что выводит print(numbers). Это список всех ваших номеров?
Вы правы, он печатает все числа, мой вывод (веб-сканирование) содержит только контент с первого URL-адреса с первым номером
Вы получаете один и тот же вывод N раза, где N - это количество чисел в файле .txt, или вы получаете вывод только один раз?
нет, я получаю правильный результат. шесть чисел в файле, и эти шесть чисел являются выходными. Но я должен меня поправить: я получил результат url с последним (не первым) номером в txt-файле
О ... Вы имеете в виду, что записываете результат своего парсинга в файл .txt, верно? Убедитесь, что вы используете "a" вместо типа "w", например with open("file.txt", "a") as f:... Обратите внимание, что "w" означает записать в файл, но удалить все предыдущее содержимое, а "a" означает добавить новый контент и сохранить предыдущий.
нет. У меня есть txt-файл с номерами для разных URL. И вывод py-script - это некоторые данные из URL-адресов (каждое число создает новый URL-адрес) в новом созданном csv-файле. И с вашим кодом мой вывод - это только очищенные данные из URL-адреса с последним номером из txt-файла.
Во всяком случае, я совершенно уверен, что проблема та же: ваши предыдущие данные заменяются новыми данными на каждой итерации.
извините, вы знаете, что я здесь новенький, как я могу показать вам весь код сейчас? Редактировать мой вопрос?
Редактировать вопрос с частью для обработки / сохранения вывода
Возможно, проблема в "# /" в конце URL-адреса? Нужна ли мне буква "s" после%? Но я пробовал с и без ...
Вы должны поместить код, начинающийся с uClient = uReq(my_url), в цикл for на том же уровне отступа, что и url = 'http://www.example.com/%s' % number ...
Шлейф работает. Большое спасибо. Теперь я думаю, что мне нужно открыть новый вопрос, потому что мои результаты не так "хороши", как я надеялся. Для одной строки он отображается нормально, но несколько строк являются «несортированными».
Прохладный! Вы можете принять ответ, если это решило вашу проблему. Спасибо
Вы можете перебирать строки файла по-разному, но я думаю, что наиболее чистый способ - это использовать pandas.
Вам просто нужно сделать это:
import pandas as pd
df = pd.read_csv("filename.csv")
# assuming that filename.csv's first line has a header called "Numbers"
# You can apply a function `func` to each element of the column via `map`
df['Numbers'].map(func)
Используя функцию pandas map, мы можем передать каждое значение функции для создания нашего URL-адреса.
# First of all, we define this function
def numberToUrl(number):
# We can use python's `string.format()` to format a string
return 'http://www.example.com/{}/.../'.format(number)
# Then we can pass this function to each value with `map`
# and assign the result to a new column
df['url'] = df['Numbers'].map(numberToUrl)
# We can print the first 5 elements via:
df.head()
Как видите, передать функцию каждой строке чрезвычайно просто. Если вы хотите перебирать строки, вы можете сделать это так:
for (index, row) in df['url'].iteritems():
# Do your operations here
В вашем случае это будет примерно так:
for (index, row) in df['url'].iteritems():
uClient = uReq(row)
page_html = uClient.read()
uClient.close()
page_soup = soup(page_html, "html.parser")
# ...
Я бы не рекомендовал использовать urllib.request напрямую. Вместо этого вы можете использовать библиотеку-оболочку под названием requests
Я просто пытаюсь, но получаю сообщение об ошибке «AttributeError: объект 'Series' не имеет атрибута 'iterrows'», и я до сих пор не обнаружил ошибку.
Он работает как сценарий Андерссона. Только последний результат ... Я думаю, проблема где-то еще в моем сценарии. Спасибо!!
Так в чем проблема? Вы хотите извлечь числа из текстового файла в список Python или как?