Python: AttributeError: у объекта 'bytes' нет атрибута 'find_all' - PullRequest
0 голосов
/ 29 марта 2020

Просто тестировал, пытаясь заставить работать веб-скребинг, но это меня беспокоит. Это мой код.

import requests
from bs4 import BeautifulSoup
from csv import writer

page = requests.get('https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=pc&_sacat=0')

soup = BeautifulSoup(page.text,'html.parser').encode("utf-8")
posts = soup.find_all(class_='s-item__wrapper clearfix')

with open('ebay.csv', 'w') as csv_file:
    csv_writer = writer(csv_file)
    headers = ['Title', 'Price', 'Link']
    csv_writer.writerow(headers)

    for post in posts:
        price = post.find(class_='s-item__price').get_text().replace('\n', '')
        title = post.find(class_='s-item__title').get_text().replace('\n', '')
        link = post.find('a')['href']
        csv_writer.writerow([title, price, link])

Я продолжаю получать эту ошибку

Traceback (most recent call last):
  File "path/WebScraping.py", line 8, in <module>
    posts = soup.find_all(class_='s-item__wrapper clearfix')
AttributeError: 'bytes' object has no attribute 'find_all'

Пытался найти другие решения, но не могу найти то, что мне подходит. Код работает, но только для трети страницы.

Ответы [ 2 ]

0 голосов
/ 29 марта 2020
import requests
from bs4 import BeautifulSoup
import csv



def Main(url):
    r = requests.get(url)
    soup = BeautifulSoup(r.content, 'html.parser')
    names = [item.text for item in soup.findAll(
        "h3", class_="s-item__title")]
    prices = [item.text for item in soup.findAll(
        "span", class_="s-item__price")]
    urls = [item.get("href")
            for item in soup.findAll("a", class_="s-item__link")]
    with open("result.csv", 'w', newline="", encoding="UTF-8") as f:
        wrriter = csv.writer(f)
        wrriter.writerow(["Name", "Price", "Url"])
        data = zip(names, prices, urls)
        wrriter.writerows(data)


Main("https://www.ebay.com/sch/i.html?_from=R40&_trksid=m570.l1313&_nkw=pc&_sacat=0")

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

Примечание. Вы использовали soup.find_all(class_='s-item__wrapper clearfix') вместо soup.find_all("div", class_='s-item__wrapper clearfix')

Вот почему вы получили AttributeError

А что касается UnicodeEncodeError, я полагаю, что вы используете Windows, где кодировкой по умолчанию является cp1252, которая не сможет прочитать Unicode, например, ?.

try:

print(\u2714)

Вывод должен быть: ✔ но ваша система выдаст UnicodeEncodeError.

Таким образом, у вас есть 2 варианта или изменить вашу систему locale настроек,

, открыть cmd.exe , затем набрать chcp, я верю, что вы получите 437, что составляет United States.

Теперь вам нужно изменить его на chcp 65001, что является UTF-8 поддержкой. Ref ..

или для кодирования csv с utf-8 с encoding="UTF-8"

0 голосов
/ 29 марта 2020

Вы пытаетесь закодировать объект soup, который создает bytes представление объекта этого объекта, и в объекте bytes нет метода с именем find_all.

Заменить:

soup = BeautifulSoup(page.text,'html.parser').encode("utf-8")

С:

soup = BeautifulSoup(page.text,'html.parser')
...