AttributeError: объект 'str' не имеет атрибута 'get' или в лучшем случае возвращает None - PullRequest
0 голосов
/ 23 января 2020

Я ищу URL одной из книг: https://www.bookdepository.com/search?searchTerm=painted+house+grisham&search=Find+book

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

Я не знаю, какая часть кода должна быть изменена ниже. В лучшем случае этот скрипт возвращает None, что говорит мне о том, что soup оказался безвкусным. Спасибо за вашу помощь.

def get_detail_data(soup):
"""Get info from each product page."""

    # title
    if extension == 'com':
        if site == 'bookdepository':
            try:
                title = soup.select_one('h1[itemprop="name"]')
                # for div in title.select('div'):
                #     div.extract()
                # title = title.get_text(strip=True).replace(';', ' ')
            except:
                title = ''
# ...code continues

def get_index_data(soup):
"""Get product link from index page (not pagination link)."""

    if extension == 'com':
        try:
            # links = soup.find_all('a', class_='s-item__link')
            # links = soup.find_all('h3', class_='title')
            # links = soup.find_all('a', href=True)[0]['href']
            links = soup.find("a").get("href")
            # links = soup.find_all('a', class_='s-item__link')
            # print(links)
            # links = soup.select('.title a')
            # for a in links:
            #     links = links.get_text(strip=True).replace(';', ' ')
        except:
            links = []

    elif #...code continues

    res_url = [item.get('href') for item in links]

    return res_url

==== ОБНОВЛЕНИЕ

В get_index_data(soup) Я заменил links = soup.find("a").get("href") на links = soup.find_all('div', {'class': 'item-info'}).find_all("a", href=True) безрезультатно.

Теперь, когда Я нахожусь над links в res_url, он говорит мне: Local variable 'links' might be referenced before assignment

Я не знаю, откуда go оттуда.

==== ОБНОВЛЕНИЕ

После небольшой очистки я снова возвращаюсь к той же ошибке: AttributeError: 'str' object has no attribute 'get' на уровне назначения res_url. Ключевое слово links подсвечивается.

==== ОБНОВЛЕНИЕ

Я использовал строку, чтобы определить URL как url = ''. Но теперь я перешел к словарю URL, как в urls = {'url1': 'blah', 'url2': 'blah'}

Итак, теперь вопрос в том, как преобразовать urls = [item.get('href') for item in links] без .get, чтобы получить URL, выбранный пользователем.

==== ОБНОВЛЕНИЕ

В def get_index_data(soup) я придумал эту строку: links = [k for k, v in urls.items() if v == urls[site]]

urls в urls.items() подсвечивается.

Но Мой словарь URL-адресов находится в функции main () внизу скрипта. Я положил это в верхней части сценария. Ничего не меняется Поэтому я не понимаю, как извлечь один URL из словаря URL-адресов, используя приведенное выше понимание links.

Ответы [ 2 ]

0 голосов
/ 23 января 2020

Если у вас красивый суп 4.7.1 или выше, вы можете использовать следующий селектор css, чтобы получить все ссылки на товары.

import requests
from bs4 import BeautifulSoup
url='https://www.bookdepository.com/search?searchTerm=painted+house+grisham&search=Find+book'
res=requests.get(url).text
soup=BeautifulSoup(res,'html.parser')
links=[item['href'] for item in soup.select("div.item-info >h3 >a[href]")]
print(links)
print(len(links))

Вывод :

['/Painted-House-John-Grisham/9780440237228?ref=grid-view&qid=1579799743707&sr=1-1', '/Painted-House-John-Grisham/9780099537021?ref=grid-view&qid=1579799743707&sr=1-2', '/Painted-House-John-Grisham/9780385337939?ref=grid-view&qid=1579799743707&sr=1-3', '/Painted-House-John-Grisham/9780345532046?ref=grid-view&qid=1579799743707&sr=1-4', '/Painted-House-John-Grisham/9780385501200?ref=grid-view&qid=1579799743707&sr=1-5', '/La-granja-Painted-House-John-Grisham/9788499080826?ref=grid-view&qid=1579799743707&sr=1-6', '/Painted-House-John-Grisham/9781613834909?ref=grid-view&qid=1579799743707&sr=1-7', '/Painted-House-John-Grisham/9780099416159?ref=grid-view&qid=1579799743707&sr=1-8', '/X100-Corks-Painted-House-Pallet-John-Grisham/9780099440895?ref=grid-view&qid=1579799743707&sr=1-9', '/Painted-House-Header-W-H-Smith-Only-John-Grisham/9780099442790?ref=grid-view&qid=1579799743707&sr=1-10', '/Painted-House-John-Grisham/9780553527728?ref=grid-view&qid=1579799743707&sr=1-11', '/Painted-House-John-Grisham/9780385501217?ref=grid-view&qid=1579799743707&sr=1-12', '/Painted-House-27c-Hc-Aud-LP-Mix-Flr-John-Grisham/9780385502399?ref=grid-view&qid=1579799743707&sr=1-13', '/Painted-House-12-Copy-Slimline-Floor-Display-John-Grisham/9780385501910?ref=grid-view&qid=1579799743707&sr=1-14', '/18c-MM-Solo-Flr-Display-Painted-House-John-Grisham/9780440803812?ref=grid-view&qid=1579799743707&sr=1-15', '/X18-Painted-House-Dumpbin-John-Grisham/9780712689618?ref=grid-view&qid=1579799743707&sr=1-16', '/RC-527-Painted-House-X6-Counterp-John-Grisham/9781856865081?ref=grid-view&qid=1579799743707&sr=1-17', '/Painted-House-John-Grisham/9781439568279?ref=grid-view&qid=1579799743707&sr=1-18', '/La-Casa-Dipinta-Painted-House-John-Grisham/9788804505518?ref=grid-view&qid=1579799743707&sr=1-19', '/Painted-House-John-Grisham/9780099586098?ref=grid-view&qid=1579799743707&sr=1-20', '/Painted-House-Complete-Unabridged-John-Grisham/9780754054634?ref=grid-view&qid=1579799743707&sr=1-21', '/Die-Farm-5-Audio-CDs-Painted-House-5-Audio-CDs-dtsch-Version-John-Grisham/9783898308144?ref=grid-view&qid=1579799743707&sr=1-22', '/Brethren-John-Grisham/9780091896492?ref=grid-view&qid=1579799743707&sr=1-23', '/Painted-House-John-Grisham/9780553712742?ref=grid-view&qid=1579799743707&sr=1-24', '/Painted-House-John-Grisham/9780440295983?ref=grid-view&qid=1579799743707&sr=1-25', '/18c-Solo-Painted-House-TV-Tie-Floor-Display-with-Riser-John-Grisham/9780440805311?ref=grid-view&qid=1579799743707&sr=1-26', '/19-Copy-John-Grisham-Prepack-Incl-2-Tr-EA-Brethren-Chamber-King-Torts-Painted-House-Partner-Street-Lawyer-Rainmaker-John-Grisham/9780385395939?ref=grid-view&qid=1579799743707&sr=1-27', '/X18-Painted-House-Dumpbin-Export-John-Grisham/9780712689700?ref=grid-view&qid=1579799743707&sr=1-28', '/Painted-House-Complete-Unabridged-John-Grisham/9780754007272?ref=grid-view&qid=1579799743707&sr=1-29', '/Painted-House-John-Grisham/9780736689434?ref=grid-view&qid=1579799743707&sr=1-30']
30

Или, если вы хотите использовать find_all () для класса заголовка, а затем выполнить поиск find_next ('a')

import requests
from bs4 import BeautifulSoup
url='https://www.bookdepository.com/search?searchTerm=painted+house+grisham&search=Find+book'
res=requests.get(url).text
soup=BeautifulSoup(res,'html.parser')
linksall=[item.find_next('a',href=True)['href'] for item in soup.find_all("div", class_="item-info")]
print(linksall)
print(len(linksall))

Вывод :

['/Painted-House-John-Grisham/9780440237228?ref=grid-view&qid=1579799743707&sr=1-1', '/Painted-House-John-Grisham/9780099537021?ref=grid-view&qid=1579799743707&sr=1-2', '/Painted-House-John-Grisham/9780385337939?ref=grid-view&qid=1579799743707&sr=1-3', '/Painted-House-John-Grisham/9780345532046?ref=grid-view&qid=1579799743707&sr=1-4', '/Painted-House-John-Grisham/9780385501200?ref=grid-view&qid=1579799743707&sr=1-5', '/La-granja-Painted-House-John-Grisham/9788499080826?ref=grid-view&qid=1579799743707&sr=1-6', '/Painted-House-John-Grisham/9781613834909?ref=grid-view&qid=1579799743707&sr=1-7', '/Painted-House-John-Grisham/9780099416159?ref=grid-view&qid=1579799743707&sr=1-8', '/X100-Corks-Painted-House-Pallet-John-Grisham/9780099440895?ref=grid-view&qid=1579799743707&sr=1-9', '/Painted-House-Header-W-H-Smith-Only-John-Grisham/9780099442790?ref=grid-view&qid=1579799743707&sr=1-10', '/Painted-House-John-Grisham/9780553527728?ref=grid-view&qid=1579799743707&sr=1-11', '/Painted-House-John-Grisham/9780385501217?ref=grid-view&qid=1579799743707&sr=1-12', '/Painted-House-27c-Hc-Aud-LP-Mix-Flr-John-Grisham/9780385502399?ref=grid-view&qid=1579799743707&sr=1-13', '/Painted-House-12-Copy-Slimline-Floor-Display-John-Grisham/9780385501910?ref=grid-view&qid=1579799743707&sr=1-14', '/18c-MM-Solo-Flr-Display-Painted-House-John-Grisham/9780440803812?ref=grid-view&qid=1579799743707&sr=1-15', '/X18-Painted-House-Dumpbin-John-Grisham/9780712689618?ref=grid-view&qid=1579799743707&sr=1-16', '/RC-527-Painted-House-X6-Counterp-John-Grisham/9781856865081?ref=grid-view&qid=1579799743707&sr=1-17', '/Painted-House-John-Grisham/9781439568279?ref=grid-view&qid=1579799743707&sr=1-18', '/La-Casa-Dipinta-Painted-House-John-Grisham/9788804505518?ref=grid-view&qid=1579799743707&sr=1-19', '/Painted-House-John-Grisham/9780099586098?ref=grid-view&qid=1579799743707&sr=1-20', '/Painted-House-Complete-Unabridged-John-Grisham/9780754054634?ref=grid-view&qid=1579799743707&sr=1-21', '/Die-Farm-5-Audio-CDs-Painted-House-5-Audio-CDs-dtsch-Version-John-Grisham/9783898308144?ref=grid-view&qid=1579799743707&sr=1-22', '/Brethren-John-Grisham/9780091896492?ref=grid-view&qid=1579799743707&sr=1-23', '/Painted-House-John-Grisham/9780553712742?ref=grid-view&qid=1579799743707&sr=1-24', '/Painted-House-John-Grisham/9780440295983?ref=grid-view&qid=1579799743707&sr=1-25', '/18c-Solo-Painted-House-TV-Tie-Floor-Display-with-Riser-John-Grisham/9780440805311?ref=grid-view&qid=1579799743707&sr=1-26', '/19-Copy-John-Grisham-Prepack-Incl-2-Tr-EA-Brethren-Chamber-King-Torts-Painted-House-Partner-Street-Lawyer-Rainmaker-John-Grisham/9780385395939?ref=grid-view&qid=1579799743707&sr=1-27', '/X18-Painted-House-Dumpbin-Export-John-Grisham/9780712689700?ref=grid-view&qid=1579799743707&sr=1-28', '/Painted-House-Complete-Unabridged-John-Grisham/9780754007272?ref=grid-view&qid=1579799743707&sr=1-29', '/Painted-House-John-Grisham/9780736689434?ref=grid-view&qid=1579799743707&sr=1-30']
30

Надеюсь, это то, что вы после.

0 голосов
/ 23 января 2020

Когда ваш try не удастся, он даст вам links = []. Затем вы пытаетесь перебрать пустой список, поэтому вы получаете None. Вам также, вероятно, нужно использовать find_all(), так как find() вернет только первый найденный элемент (в данном случае a, а если тег a не имеет href, вы снова вернетесь ничего.

Вам придется немного отфильтровать, так как в исходном коде страницы 262 ссылки. Я могу помочь вам начать с этого, но вам нужно будет предоставить более подробную информацию / информацию. для получения дополнительной помощи:

Посмотрите на этот код, чтобы разобраться, что вы хотите:

import requests
from bs4 import BeautifulSoup

url = 'https://www.bookdepository.com/search?searchTerm=painted+house+grisham&search=Find+book'
response = requests.get(url)

soup = BeautifulSoup(response.text, 'html.parser')
links = soup.find_all("a", href=True)
for each in links:
    print(each.get('href'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...