Данные Webscrape вызывают ошибку workbook.close(). Как я могу это исправить?

Я пытаюсь создать веб-скребок (в качестве побочного проекта), который извлекает отзывы из отелей Страница отзывов Google и печатает их на листе Excel. Страница имеет бесконечную прокрутку и индексируется на 10, начиная с 0. С этой целью я использую BeautifulSoup. Мой код выглядит следующим образом:

import requests
import xlsxwriter
from bs4 import BeautifulSoup

index = 0
reviewlist = []
while index <= 700:
    url = "https://www.google.com/async/reviewSort?vet=12ahUKEwibi8-45LriAhUXeisKHbROA6sQxyx6BAgBED0..i&ved=2ahUKEwibi8-45LriAhUXeisKHbROA6sQjit6BAgBEHw&rlz=1C1GCEB_enAU817AU817&yv=3&async=feature_id:0x6ad642b40a5fb91f%3A0xd4af4255ed578be2,review_source:All%20reviews,sort_by:qualityScore,start_index:{},is_owner:false,filter_text:,next_page_token:,_pms:s,_fmt:pc".format(index)
    response = requests.get(url)
    soup = BeautifulSoup(response.text, "html.parser")
    tenreviews = soup.findAll("span", {"jsl": "$t t-uvHqeLvCkgA;$x 0;"})
    reviewlist += tenreviews
    index += 10

# Export to Excel sheet
workbook = xlsxwriter.Workbook('doubletreereviews.xlsx')
worksheet = workbook.add_worksheet()

row = 0
for review in reviewlist:
    worksheet.write(row, 0, review)
    row += 1

workbook.close()

При запуске моего кода он выдает следующую ошибку TypeError.

TypeError: expected string or bytes-like object

Я заметил, что некоторые элементы печатаются нормально, а другие вызывают ошибку. Например, если я заменю список конкретным отдельным обзором, добавив приведенный ниже код, прежде чем пытаться экспортировать в лист Excel, он сработает, создав лист Excel с одним обзором в формате A1.

reviewlist = reviewlist[4]

Из этого я сделал вывод, что это как-то связано с тем фактом, что четвертый обзор в списке не имеет дочернего элемента/потомка (не уверен, правильно ли я использую этот термин, который я нашел в документации BeautifulSoups), в то время как в других обзорах есть.

Может ли кто-нибудь пролить свет на это и помочь мне исправить это?

Если есть какие-либо проблемы с моим вопросом, объяснением или кодом, не стесняйтесь, дайте мне знать. Я стараюсь учиться как можно больше!

Пожалуйста, вставьте полный traceback?

shaik moeed 27.05.2019 09: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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
5
1
116
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

TypeError: expected string or bytes-like object

потому что вы пытаетесь написать объект BeautifulSoup Tag

worksheet.write(row, 0, review)

где review — экземпляр <class 'bs4.element.Tag'>.

Аргумент review должен быть типа string или number, а не Tag.

Изменен аргумент обзора на str (обзор), и это было решено. Спасибо, Бхаратк!

Reitai 28.05.2019 05:16

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