首页 > 解决方案 > AttributeError:“str”对象没有属性“get”或最多返回 None

问题描述

我正在寻找其中一本书的网址: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

我不知道从那里去哪里。

==== 更新

经过一番清理后,我现在又回到了同样的错误: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]]

urlsinurls.items()被突出显示。

但是我的 urls 字典位于脚本底部的 main() 函数中。我把它放在脚本的顶部。没有什么变化。所以我不知道如何使用links上面的列表理解从 urls 字典中检索一个 url。

标签: pythonpython-3.xbeautifulsoup

解决方案


当你try失败时,它会给你links = []。然后你尝试遍历一个空列表,因此你得到 None。您可能还需要使用find_all(), asfind()只会返回它找到的第一个元素(在这种情况下a,如果a标签没有href,那么您将一无所获。

您将不得不进行一些过滤,因为页面源中有 262 个 href。我可以帮助您开始,但您需要提供更多详细信息/信息以获得更多帮助:

看看这段代码来帮助你理清你想要的东西:

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'))

推荐阅读