【问题标题】:AttributeError: 'NoneType' object has no attribute 'get_text' with input idAttributeError:“NoneType”对象没有带有输入 ID 的属性“get_text”
【发布时间】:2021-07-25 03:29:16
【问题描述】:
url = 'https://www.amazon.ca/Powerextra-Replacement-Battery-Compatible-NP-FZ100/dp/B07PQQQ82K/ref=bmx_4?pd_rd_w=TNcoX&pf_rd_p=d9347c84-a27a-4c22-b959-7bb71382273b&pf_rd_r=E7RKN5D6HSM4TFZQJCGT&pd_rd_r=e8bff283-bc96-4b77-b31a-f413b4d62e40&pd_rd_wg=wje3Z&pd_rd_i=B07PQQQ82K&psc=1'
headers = 'headers = { "user-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36'}'
page = requests.get(url, headers= headers)
soup = BeautifulSoup(page.content, "lxml")

title = soup.find('input', {'id': 'mbb-offeringID-1'}).get_text()
print(title)

我也试过了:

title = soup.find('input', {'id': 'mbb-offeringID-1'}).get('value')
print(title)

然后我尝试了它是否通常与“跨度 ID”一起工作并且它给出了相同的错误

title = soup.find(id = "productTitle").get_text()

【问题讨论】:

  • 看起来该 ID 不在 requests 检索的 HTML 中。您确定之后没有使用 Javascript 加载它吗? print('mbb-offeringID-1' in soup) # False
  • 打印错误
  • 是的,这意味着您要查找的元素在您最初的requests.get() 呼叫中不存在。这可能意味着亚马逊将包含 HTML 内容在页面最初通过 Javascript 加载之后,这意味着无法使用此方法抓取内容。您必须使用 Selenium 等框架模拟运行 Javascript 的浏览器。
  • 感谢您的回复。 Selenium 很不错,只是不方便用它切换代理。

标签: python beautifulsoup request


【解决方案1】:

尝试添加"Accept-Language": "en-US,en;q=0.5" HTTP 标头以获得服务器的正确响应:

import requests
from bs4 import BeautifulSoup


url = "https://www.amazon.ca/Powerextra-Replacement-Battery-Compatible-NP-FZ100/dp/B07PQQQ82K/ref=bmx_4?pd_rd_w=TNcoX&pf_rd_p=d9347c84-a27a-4c22-b959-7bb71382273b&pf_rd_r=E7RKN5D6HSM4TFZQJCGT&pd_rd_r=e8bff283-bc96-4b77-b31a-f413b4d62e40&pd_rd_wg=wje3Z&pd_rd_i=B07PQQQ82K&psc=1"
headers = headers = {
    "User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:88.0) Gecko/20100101 Firefox/88.0",
    "Accept-Language": "en-US,en;q=0.5",
}
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.content, "lxml")

title = (
    soup.find("input", {"id": "mbb-offeringID-1"})
    .find_next("span")
    .get_text(strip=True, separator=" ")
)
print(title)

打印:

Asurion 3-Year Protection Plan for $14.99

【讨论】:

  • 嗨,再次。我试图在soup = ......之前在request.get中传递一个代理,它又给了我同样的错误。
  • @ShiO 确保您收到的是普通页面而不是验证码页面。对于代理网站,这很常见。
  • 再次感谢,代理似乎将我引导至验证码页面。奇怪,这是住宅代理,我几乎不使用它们。
猜你喜欢
  • 2015-04-07
  • 1970-01-01
  • 2017-12-28
  • 1970-01-01
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多