【问题标题】:AttributeError: 'str' object has no attribute 'get' or return None at bestAttributeError:“str”对象没有属性“get”或最多返回 None
【发布时间】:2020-01-23 15:25:19
【问题描述】:

我正在寻找其中一本书的网址: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) 无济于事。

现在,当我将鼠标悬停在 res_url 中的 links 上时,它会告诉我:Local variable 'links' might be referenced before assignment

我不知道从那里去哪里。

==== 更新

经过一番清理,我现在又回到了同样的错误:AttributeError: 'str' object has no attribute 'get' 位于 res_url 分配的级别。 links 关键字被突出显示。

==== 更新

我使用字符串将 url 定义为url = ''。但现在我转到了一个网址字典,如urls = {'url1': 'blah', 'url2': 'blah'}

所以现在的问题是如何在没有.get 的情况下转换urls = [item.get('href') for item in links] 以检索用户选择的url。

==== 更新

def get_index_data(soup) 中,我想出了这一行: links = [k for k, v in urls.items() if v == urls[site]]

urls.items() 中的urls 被突出显示。

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

【问题讨论】:

  • 如果你能给出汤中存在的数据或计算汤的整个代码,我们或任何人都可以提供帮助..
  • links = soup.find("a").get("href") 已经在调用get 方法,该方法可能会返回一个字符串列表,因此您不能再对其调用get 方法。
  • 谢谢大家。我正在尝试应用您所有的好建议和指导。我会尽快报告。顺便说一句,我更新了代码。很遗憾,我无法发布所有内容。
  • 刚刚对我的问题进行了编辑。
  • 在 if 语句的某些部分中,您没有定义链接。

标签: python python-3.x beautifulsoup


【解决方案1】:

当你的try 失败时,它会给你links = []。然后你尝试遍历一个空列表,因此你得到 None。您可能还需要使用find_all(),因为find() 只会返回它找到的第一个元素(在这种情况下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'))

【讨论】:

  • 这确实有效,但我用您需要的更多信息编辑了我的问题。
【解决方案2】:

如果你有漂亮的汤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

希望这就是你所追求的。

【讨论】:

  • 感谢昆杜克。但我会在收到我目前遇到的 links 分配问题后立即尝试您的解决方案。
猜你喜欢
  • 2020-04-01
  • 2021-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多