Python 3.6 получить текст из списка

Я абсолютный новичок, но мне удалось создать рабочий сценарий из некоторых существующих сценариев и руководств. Я хотел бы иметь только одно, но, к сожалению, не могу этого сделать.

Пока я получаю данные с веб-сайта, например "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()

Так в чем проблема? Вы хотите извлечь числа из текстового файла в список Python или как?

Andersson 18.05.2018 14:59

Например, у меня есть файл numbers.txt с: 05543486 3468169 36189994 Теперь я хочу поместить каждое число в URL-адрес ...

Juli Goe 18.05.2018 15:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
1 434
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете создать функцию, которая запускает цикл 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] мне нужно открыть и прочитать файл? Но как?

Juli Goe 18.05.2018 14:57

Вы можете добиться этого, добавив числа в конце вашего 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...

Да, но я хочу указать конкретные числа из внешнего файла. Каждое число в строке файла.

Juli Goe 18.05.2018 15:05

@JuliGoe отредактировал код, на этот вопрос, вероятно, уже есть ответ, вам нужно его поискать.

BcK 18.05.2018 15:10
Ответ принят как подходящий

Вы можете использовать приведенный ниже код:

# 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

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

Juli Goe 18.05.2018 15:28

Еще петли? Зачем? С моим кодом вы сможете перебирать все числа ... Проверьте, что выводит print(numbers). Это список всех ваших номеров?

Andersson 18.05.2018 15:45

Вы правы, он печатает все числа, мой вывод (веб-сканирование) содержит только контент с первого URL-адреса с первым номером

Juli Goe 18.05.2018 15:54

Вы получаете один и тот же вывод N раза, где N - это количество чисел в файле .txt, или вы получаете вывод только один раз?

Andersson 18.05.2018 15:57

нет, я получаю правильный результат. шесть чисел в файле, и эти шесть чисел являются выходными. Но я должен меня поправить: я получил результат url с последним (не первым) номером в txt-файле

Juli Goe 18.05.2018 16:02

О ... Вы имеете в виду, что записываете результат своего парсинга в файл .txt, верно? Убедитесь, что вы используете "a" вместо типа "w", например with open("file.txt", "a") as f:... Обратите внимание, что "w" означает записать в файл, но удалить все предыдущее содержимое, а "a" означает добавить новый контент и сохранить предыдущий.

Andersson 18.05.2018 16:04

нет. У меня есть txt-файл с номерами для разных URL. И вывод py-script - это некоторые данные из URL-адресов (каждое число создает новый URL-адрес) в новом созданном csv-файле. И с вашим кодом мой вывод - это только очищенные данные из URL-адреса с последним номером из txt-файла.

Juli Goe 18.05.2018 16:10

Во всяком случае, я совершенно уверен, что проблема та же: ваши предыдущие данные заменяются новыми данными на каждой итерации.

Andersson 18.05.2018 16:13

извините, вы знаете, что я здесь новенький, как я могу показать вам весь код сейчас? Редактировать мой вопрос?

Juli Goe 18.05.2018 16:17

Редактировать вопрос с частью для обработки / сохранения вывода

Andersson 18.05.2018 16:20

Возможно, проблема в "# /" в конце URL-адреса? Нужна ли мне буква "s" после%? Но я пробовал с и без ...

Juli Goe 18.05.2018 16:31

Вы должны поместить код, начинающийся с uClient = uReq(my_url), в цикл for на том же уровне отступа, что и url = 'http://www.example.com/%s' % number ...

Andersson 18.05.2018 16:38

Шлейф работает. Большое спасибо. Теперь я думаю, что мне нужно открыть новый вопрос, потому что мои результаты не так "хороши", как я надеялся. Для одной строки он отображается нормально, но несколько строк являются «несортированными».

Juli Goe 18.05.2018 16:50

Прохладный! Вы можете принять ответ, если это решило вашу проблему. Спасибо

Andersson 18.05.2018 16:52

Загрузить из файла CSV

Вы можете перебирать строки файла по-разному, но я думаю, что наиболее чистый способ - это использовать 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)

URL-адреса из номеров

Используя функцию 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'», и я до сих пор не обнаружил ошибку.

Juli Goe 18.05.2018 15:56

Он работает как сценарий Андерссона. Только последний результат ... Я думаю, проблема где-то еще в моем сценарии. Спасибо!!

Juli Goe 18.05.2018 16:39

Другие вопросы по теме