如何使用 Python 和 BeautifulSoup 访问其他 div
How to access other divs with Python and BeautifulSoup
我正在尝试使用 Python 和 BeautifulSoup 访问嵌套在 div
中的其他 div
,但似乎出现错误。
my_url='https://www.boohooman.com/mens/shirts/white-shirts'
data= Soup(page, "html.parser")
P_Info= Soup.findAll("div",{"class":"product-tile js-product-tile"})
content=P_Info[0]
现在,content.div
打印:
<div itemprop="brand" itemscope="" itemtype="https://schema.org/Brand">
并且,content.a
打印:
<a class="thumb-link js-canonical-link"
这个a
在前一个div
的兄弟div
里面。
然而,content.div.div
不打印任何内容。而且,content.div.div.a
抛出一个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'a')
有人可以指出我做错了什么吗?
这是每个产品图块的结构 (a.k.a content
):
( content
) -> ( div
) -> ( div
) + ( div
-> a
)
您正试图在 content
中找到锚元素 a
。但是,这个 a
在第二个 div
里面。您的逻辑的问题是,您试图通过调用 content.div.div
在 content
中的第一个 div
中找到它 - 默认情况下选择第一个 div content
。但是 content
里面的第一个 div
没有任何 a
元素。因此,content.div.div
被赋值为 NoneType
.
这是完全允许的。但是,当您键入:content.div.div.a
时,您正在尝试在 NoneType
对象内部进行搜索,这会引发您在屏幕上看到的错误。
解决方案: 你需要找到第二个 div
(我称之为 target
),输入:
target = content.find("div", {"class":"product-image js-product-image load-bg"})
现在,您可以安全地调用 target.a
来获取您正在寻找的 a
!
编辑:由于您的评论说您想实施逻辑以从页面上的每个产品获取所有必要信息,这里是完整代码。
import requests
from bs4 import BeautifulSoup
URL = "https://www.boohooman.com/mens/shirts/white-shirts"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
productTiles = soup.findAll("div", {"class": "product-tile js-product-tile"})
for productTile in productTiles:
nameElement = productTile.find(
"a", {"class": "name-link js-canonical-link"})
name = nameElement.text.strip()
print(f"Name: {name}")
linkElement = productTile.find(
"a", {"class": "thumb-link js-canonical-link"})
link = linkElement["href"]
link = URL + link
print(f"Link: {link}")
imgElement = productTile.find("img")
imgSrc = imgElement["src"]
print(f"Image: {imgSrc}")
stdPriceElement = productTile.find(
"span", {"class": "product-standard-price"})
if stdPriceElement is not None:
stdPrice = stdPriceElement.text.strip()
print(f"Standard price: {stdPrice}")
salesPriceElement = productTile.find(
"span", {"class": "product-sales-price"})
if salesPriceElement is not None:
salesPrice = salesPriceElement.text.strip()
print(f"Sales price: {salesPrice}")
print("----------------------------------------------")
我正在尝试使用 Python 和 BeautifulSoup 访问嵌套在 div
中的其他 div
,但似乎出现错误。
my_url='https://www.boohooman.com/mens/shirts/white-shirts'
data= Soup(page, "html.parser")
P_Info= Soup.findAll("div",{"class":"product-tile js-product-tile"})
content=P_Info[0]
现在,content.div
打印:
<div itemprop="brand" itemscope="" itemtype="https://schema.org/Brand">
并且,content.a
打印:
<a class="thumb-link js-canonical-link"
这个a
在前一个div
的兄弟div
里面。
然而,content.div.div
不打印任何内容。而且,content.div.div.a
抛出一个错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'a')
有人可以指出我做错了什么吗?
这是每个产品图块的结构 (a.k.a content
):
( content
) -> ( div
) -> ( div
) + ( div
-> a
)
您正试图在 content
中找到锚元素 a
。但是,这个 a
在第二个 div
里面。您的逻辑的问题是,您试图通过调用 content.div.div
在 content
中的第一个 div
中找到它 - 默认情况下选择第一个 div content
。但是 content
里面的第一个 div
没有任何 a
元素。因此,content.div.div
被赋值为 NoneType
.
这是完全允许的。但是,当您键入:content.div.div.a
时,您正在尝试在 NoneType
对象内部进行搜索,这会引发您在屏幕上看到的错误。
解决方案: 你需要找到第二个 div
(我称之为 target
),输入:
target = content.find("div", {"class":"product-image js-product-image load-bg"})
现在,您可以安全地调用 target.a
来获取您正在寻找的 a
!
编辑:由于您的评论说您想实施逻辑以从页面上的每个产品获取所有必要信息,这里是完整代码。
import requests
from bs4 import BeautifulSoup
URL = "https://www.boohooman.com/mens/shirts/white-shirts"
page = requests.get(URL)
soup = BeautifulSoup(page.content, "html.parser")
productTiles = soup.findAll("div", {"class": "product-tile js-product-tile"})
for productTile in productTiles:
nameElement = productTile.find(
"a", {"class": "name-link js-canonical-link"})
name = nameElement.text.strip()
print(f"Name: {name}")
linkElement = productTile.find(
"a", {"class": "thumb-link js-canonical-link"})
link = linkElement["href"]
link = URL + link
print(f"Link: {link}")
imgElement = productTile.find("img")
imgSrc = imgElement["src"]
print(f"Image: {imgSrc}")
stdPriceElement = productTile.find(
"span", {"class": "product-standard-price"})
if stdPriceElement is not None:
stdPrice = stdPriceElement.text.strip()
print(f"Standard price: {stdPrice}")
salesPriceElement = productTile.find(
"span", {"class": "product-sales-price"})
if salesPriceElement is not None:
salesPrice = salesPriceElement.text.strip()
print(f"Sales price: {salesPrice}")
print("----------------------------------------------")