в python, что я должен добавить для получения URL-адресов из моего (текстовый файл) или моего (xml файл), который включает список URL-адресов? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть этот код, с которым все в порядке (одна ссылка). Результат хранения значений кода (availableOffers, otherpricess, currentprice, page_url) в файле (values.csv)

мои проблемы: Первый : я не знаю, что написать для получения URL-адресов из моего (текстового файла) или моего (xml файла) вместо одного URL-адреса в этом коде

from bs4 import BeautifulSoup as soup  
from urllib.request import urlopen as uReq  

page_url = "XXXXXXXXX"


uClient = uReq(page_url)
page_soup = soup(uClient.read(), "html.parser")
uClient.close()


availableOffers = page_soup.find("input", {"id": "availableOffers"})["value"]
otherpricess = page_soup.find("span", {"class": "price"}).text.replace("$", "")
currentprice = page_soup.find("div", {"class": "is"}).text.strip().replace("$", "")


out_filename = "prices.csv"
headers = "availableOffers,otherpricess,currentprice,page_url \n"

f = open(out_filename, "w")
f.write(headers)


f.write(availableOffers + ", " + otherpricess + ", " + currentprice + ", " + page_url + "\n")

f.close()  

Вторая проблема : когда URL не имеет значения для (otherpricess), я получаю эту ошибку

line 13, in <module> 
otherpricess = page_soup.find("span", {"class": "price"}).text.replace("$", "")
AttributeError: 'NoneType' object has no attribute 'text'

, как я обхожу эту ошибку и сообщаю коду работать, даже если отсутствует значение

спасибо

1 Ответ

1 голос
/ 24 апреля 2020

Чтобы получить URL-адреса из текстового файла, вы можете open файл (точно так же, как вы сделали для записи) в режиме "r" и выполнять итерации по его строке.

Например, допустим, у вас есть следующий файл URL с именем urls.txt :

http://www.google.com
http://www.yahoo.com

Чтобы получить URL-адреса и выполнить их итерацию, выполните следующее:

out_filename = "prices.csv"
headers = "availableOffers,otherpricess,currentprice,page_url \n"

with open(out_filename, "w") as fw:
    fw.write(headers)
    with open("urls.txt", "r") as fr:
        for url in map(lambda x: x.strip(), fr.readlines()):  # the strip is to remove the trailing '\n'
            print(url)
            uClient = uReq(url)
            page_soup = soup(uClient.read(), "html.parser")
            # write the rest logic here
            # ...
            # write to the output file
            fw.write(availableOffers + ", " + otherpricess + ", " + currentprice + ", " + page_url + "\n")

Относительно вашего второго вопроса, вы можете проверить, что page_soup.find("span", {"class": "price"}) не является None, и, если это так, извлечь текст. Например:

otherpricess = page_soup.find("span", {"class": "price"}).text.replace("$", "") if page_soup.find("span", {"class": "price"}) else "" 
# in case there is no value, otherpricess will be empty string but you can change it to any other value.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...