JSON Ошибка в коде Web Scraping, Как исправить? - PullRequest
1 голос
/ 06 марта 2020

Я пытаюсь использовать этот код для сбора отзывов с сайта обзора по делам потребителей. Но я продолжал получать ошибки, особенно в разделе dateElements & jsonData. Может ли кто-нибудь помочь мне исправить этот код, чтобы он был совместим с сайтом, который я собираюсь просмотреть в Интернете?

from bs4 import BeautifulSoup
import requests
import pandas as pd
import json
print ('all imported successfuly')

# Initialize an empty dataframe
df = pd.DataFrame()
for x in range(1, 5):
    names = []
    headers = []
    bodies = []
    ratings = []
    published = []
    updated = []
    reported = []

    link = (f'https://www.consumeraffairs.com/online/allure-beauty-box.html?page={x}')
    print (link)
    req = requests.get(link)
    content = req.content
    soup = BeautifulSoup(content, "lxml")
    articles = soup.find_all('div', {'class':'rvw js-rvw'})
    for article in articles:
        names.append(article.find('strong', attrs={'class': 'rvw-aut__inf-nm'}).text.strip())
        try:
            bodies.append(article.find('p', attrs={'class':'rvw-bd'}).text.strip())
        except:
            bodies.append('')

        try:
            ratings.append(article.find('div', attrs={'class':'stars-rtg stars-rtg--sm'}).text.strip())
        except:
            ratings.append('')
        dateElements = article.find('span', attrs={'class':'ca-txt-cpt'}).text.strip()

        jsonData = json.loads(dateElements)
        published.append(jsonData['publishedDate'])
        updated.append(jsonData['updatedDate'])
        reported.append(jsonData['reportedDate'])


    # Create your temporary dataframe of the first iteration, then append that into your "final" dataframe
    temp_df = pd.DataFrame({'User Name': names, 'Body': bodies, 'Rating': ratings, 'Published Date': published, 'Updated Date':updated, 'Reported Date':reported})
    df = df.append(temp_df, sort=False).reset_index(drop=True)

print ('pass1')


df.to_csv('AllureReviews.csv', index=False, encoding='utf-8')
print ('excel done')

Это ошибка, которую я получаю

Traceback (большинство последний вызов): файл "C: / Users / Сара Джиткресорн / PycharmProjects / без названия / venv / Caffairs.py", строка 37, в файле jsonData = json .loads (dateElements) "* ​​1011 *: \ Users \ Sara Jitkresorn \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ json__init __. Py ", строка 348, в загрузках возвращает файл _default_decoder.decode (s)" C: \ Users \ Sara Jitkresorn \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ json \ decoder.py ", строка 337, в файле декодирования obj, end = self.raw_decode (s, idx = _w (s, 0) .end ()) Файл" C: \ Users \ Sara Jitkresorn \ AppData \ Local \ Programs \ Python \ Python37 \ lib \ json \ decoder.py ", строка 355, в raw_decode повышает JSONDecodeError (« Ожидаемое значение », s, err.value) из None json .decoder. JSONDecodeError: Ожидаемое значение: строка 1, столбец 1 (символ 0)

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

В дополнение к приведенному выше коду мы можем получить рейтинги и недублированные данные, как показано ниже: -

from bs4 import BeautifulSoup
import requests
import pandas as pd
print ('all imported successfuly')

# Initialize an empty dataframe
df = pd.DataFrame()
for x in range(1, 5):
    names = []
    headers = []
    bodies = []
    ratings = []
    published = []
    updated = []
    reported = []
    dateElements = []

    link = (f'https://www.consumeraffairs.com/online/allure-beauty-box.html?page={x}')
    print (link)
    req = requests.get(link)
    content = req.content
    soup = BeautifulSoup(content, "lxml")
    articles = soup.find_all('div', {'class':'rvw js-rvw'})
    for article in articles:
        names.append(article.find('strong', attrs={'class': 'rvw-aut__inf-nm'}).text.strip())
        try:
            bodies.append(article.find('div', attrs={'class':'rvw-bd'}).text.strip())
        except:
            bodies.append('NA')

        try:
            ratings.append(article.find('meta', attrs={'itemprop': 'ratingValue'})['content'])
        except:
            ratings.append('NA')
        dateElements.append(article.find('span', attrs={'class':'ca-txt-cpt'}).text.strip())
    # Create your temporary dataframe of the first iteration, then append that into your "final" dataframe
    temp_df = pd.DataFrame({'User Name': names, 'Body': bodies, 'Rating': ratings, 'Published Date': dateElements})
    df = df.append(temp_df, sort=False).reset_index(drop=True)

print ('df')
1 голос
/ 06 марта 2020

dateElements не содержит строку, которую можно проанализировать с помощью json.loads(), потому что это просто текстовая строка, например Original review: Feb. 15, 2020

Измените эти строки, чтобы обойти это:

try:
    ratings.append(article.find('div', attrs={'class':'stars-rtg stars-rtg--sm'}).text.strip())
except:
    ratings.append('')
dateElements = article.find('span', attrs={'class':'ca-txt-cpt'}).text.strip()

published.append(dateElements)

temp_df = pd.DataFrame({'User Name': names, 'Body': bodies, 'Rating': ratings, 'Published Date': published})
df = df.append(temp_df, sort=False).reset_index(drop=True)

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

# updated = []
# reported = []

Чем ваш код выполняется без ошибок, хотя вы все еще не получаете данные для Body и Rating.

df распечатать по этому адресу:

    User Name   Body    Rating  Published Date
0   M. M. of Dallas, GA             Original review: Feb. 15, 2020
1   Malinda of Aston, PA            Original review: Sept. 21, 2019
2   Ping of Tarzana, CA             Original review: July 18, 2019
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...