Невозможно напечатать только текст с помощью Beautiful soup - PullRequest
0 голосов
/ 19 апреля 2020

Я изо всех сил пытаюсь создать один из моих первых проектов на python3. Когда я использую следующий код:

def scrape_offers():
    r = requests.get("https://www.olx.bg/elektronika/kompyutrni-aksesoari-chasti/aksesoari-chasti/q-1070/?search%5Border%5D=filter_float_price%3Aasc", cookies=all_cookies)
    soup = BeautifulSoup(r.text,"html.parser")
    offers = soup.find_all("div",{'class':'offer-wrapper'})

    for offer in offers:
        offer_name = offer.findChildren("a", {'class':'marginright5 link linkWithHash detailsLink'})
        print(offer_name.text.strip())

, я получаю следующую ошибку:

Traceback (most recent call last):
  File "scrape_products.py", line 45, in <module>
    scrape_offers()
  File "scrape_products.py", line 40, in scrape_offers
    print(offer_name.text.strip())
  File "/usr/local/lib/python3.7/site-packages/bs4/element.py", line 2128, in __getattr__
    "ResultSet object has no attribute '%s'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?" % key
AttributeError: ResultSet object has no attribute 'text'. You're probably treating a list of elements like a single element. Did you call find_all() when you meant to call find()?

Я прочитал много подобных случаев на StackOverFlow, но я все еще не могу помочь себе. Если у кого-то есть идеи, пожалуйста, помогите:)

PS: Если я запускаю код без .text, он показывает весь <a class=...> ... </a>

1 Ответ

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

findchildren возвращает список. Иногда вы получаете пустой список, иногда вы получаете список с одним элементом.

Вы должны добавить оператор if, чтобы проверить, больше ли длина возвращаемого списка, чем 1, а затем напечатать текст.

import requests
from bs4 import BeautifulSoup
def scrape_offers():
    r = requests.get("https://www.olx.bg/elektronika/kompyutrni-aksesoari-chasti/aksesoari-chasti/q-1070/?search%5Border%5D=filter_float_price%3Aasc")
    soup = BeautifulSoup(r.text,"html.parser")
    offers = soup.find_all("div",{'class':'offer-wrapper'})

    for offer in offers:
        offer_name = offer.findChildren("a", {'class':'marginright5 link linkWithHash detailsLink'})
        if (len(offer_name) >= 1):
            print(offer_name[0].text.strip())

scrape_offers()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...