Python TypeError: ожидаемая строка или байтовоподобный объект - PullRequest
0 голосов
/ 20 сентября 2018

Я получаю эту ошибку, пытаясь запустить код для удаления продуктов в Amazon из существующего файла .CSV.Далее код:

Здесь я импортирую требуемые модули

import re
import csv
from urllib.request import urlopen
from bs4 import BeautifulSoup
import sys
import warnings
from requests_html import HTMLSession
import io
from io import StringIO
from PIL import Image
from html.parser import HTMLParser

Здесь я объявляю объект сеанса

session = HTMLSession()

#ignore warnings
if not sys.warnoptions:
    warnings.simplefilter("ignore")

url_array=[] #array for urls
asin_array=[] #array for asin numbers
with open('asin_list.csv', 'r') as csvfile:
    asin_reader = csv.reader(csvfile)
    for row in asin_reader:
        url_array.append(row[0]) #This url list is an array containing all the urls from the excel sheet

#The ASIN Number will be between the dp/ and another /
start = 'dp/'
end = '/'
for url in url_array:
    asin_array.append(url[url.find(start)+len(start):url.rfind(end)]) #this array has all the asin numbers

#declare the header.
headers = {'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36'}

all_items=[] #The final 2D list containing prices and details of products, that will be converted to a consumable csv

for asin in asin_array:
    item_array=[] #An array to store details of a single product.
    amazon_url="https://www.amazon.com/dp/"+asin #The general structure of a url
    response = session.get(amazon_url, headers=headers, verify=False) #get the response

    item_array.append(response.html.search('a-color-price">${}<')[0]) #Extracting the price


    #Extracting the text containing the product details
    details = response.html


    details=(response.html.search('P.when("ReplacementPartsBulletLoader").execute(function(module){ module.initializeDPX(); }){}</ul>;<'[0]))
    details_arr=[] #Declaring an array to store individual details
    details=re.sub("\n|\r", "", details) #Separate the details from text
    #details_arr=re.findall(r'\>(.*?)\<', details) #Store details in the array.

Вот ошибка:

Traceback (most recent call last):
  File "C:/Users/xxx/prueba.py", line 54, in <module>
    details=re.sub("\n|\r", "", details) #Separate the details from text
  File "C:\Users\Usuario\AppData\Local\Programs\Python\Python37\lib\re.py", line 192, in sub
    return _compile(pattern, flags).sub(repl, string, count)
TypeError: expected string or bytes-like object

Спасибо за поддержку

1 Ответ

0 голосов
/ 21 сентября 2018

Трудно точно понять, что вы ищете, но у вас есть 2 строки, очень похожие в вашем коде:

item_array.append(response.html.search('a-color-price">${}<')[0])

и

details=(response.html.search('P.when("ReplacementPartsBulletLoader").execute(function(module){ module.initializeDPX(); }){}</ul>;<'[0]))

после некоторого возни, коди тестовая страница https://www.amazon.com/dp/B01J6RPGKG/ref=nav_shopall_1_k_ods_tab_sz Первая упомянутая строка кода возвращает цену, Вторая возвращает вашу ошибку - после более пристального взгляда я думаю, что у вас может быть синтаксическая ошибка в строке:

details=(response.html.search('P.when("ReplacementPartsBulletLoader").execute(function(module){ module.initializeDPX(); }){}</ul>;<'[0]))

Вы, возможно, захотите взглянуть на эту строку - особенно в конце, я думаю, что скобка не в том месте.[0])) должно быть) [0]) Это устраняет эту ошибку и представляет новую ->

details=(response.html.search('P.when("ReplacementPartsBulletLoader").execute(function(module){ module.initializeDPX(); }){}</ul>;<')[0])
TypeError: 'NoneType' object is not subscriptable

Я думаю, что ошибка происходит для меня, потому что поиск ничего не возвращает для меня.Ради устранения неполадок, если вы примените строку, вы уже сказали что-то вроде этого:

измените это:

details=(response.html.search('P.when("ReplacementPartsBulletLoader").execute(function(module){ module.initializeDPX(); }){}</ul>;<'[0]))

на это:

details= response.html.search('a-color-price">${}<')[0]

кажется, что код работает нормально.

Так что я бы сказал, что ваша проблема, в первую очередь, в синтаксисе, а во-вторых, в том, что вы можете искать.

Удачи в вашей программе, и я надеюсь, что это поможет.

...