如何使用 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.divcontent 中的第一个 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("----------------------------------------------")