python - 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]]
urls
inurls.items()
被突出显示。
但是我的 urls 字典位于脚本底部的 main() 函数中。我把它放在脚本的顶部。没有什么变化。所以我不知道如何使用links
上面的列表理解从 urls 字典中检索一个 url。
解决方案
当你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'))
推荐阅读
- json - 使用不同的 JSON 模式验证每个 JSON 节点
- php - SQL UNION 2 SELECT 在同一张表上
- google-apps-script - AppScript - 行值更改的自定义函数更新
- r - 在for循环中运行函数
- generics - 将 JSON 数组转换为列表的更好方法
给定一个 KClass 通过 Gson - java - 如何在任务执行器中使用阻塞队列中的任务实现公平性
- javascript - 如何测试 JSX 表单输入字段与 JavaScript 变量的绑定?
- android - Android中的微调器(带有电话代码和自动国家识别)
- go - 反序列化未知 Go 的 gob blob
- sql - 给出一些指令 SQL 如何找到 AVG