如何用BeautifulSoup查找嵌套元素?爬取Medline产品链接遇阻求助
解决Medline产品链接爬取返回None的问题
我明白你遇到的问题了——你已经定位到了包含产品标题的div.medGridProdTitle元素,但直接从这个div获取href肯定会返回None,因为href属性是属于div内部的<a>标签的,而不是div本身。
下面是具体的修改方案,分两种清晰的思路:
思路1:直接定位目标<a>标签
你可以直接用BeautifulSoup的CSS选择器,查找所有属于medGridProdTitle类div下的<a>标签,这样就能直接获取到href属性:
import requests import xlsxwriter from bs4 import BeautifulSoup def cpap_spider(max_pages): row_i = 0 # 建议避免使用global,直接在函数内初始化更规范 page = 0 base_url = "https://www.medline.com" # 用来拼接相对链接为完整URL while page <= max_pages: url = f"https://www.medline.com/catalog/category-products.jsp?No={page}&itemId=Z05-CA11_07_03&N=104048&iclp=Z05-CA11_07_03" source_code = requests.get(url) plain_text = source_code.text soup = BeautifulSoup(plain_text, 'html.parser') # 直接定位div.medGridProdTitle下的a标签 for link in soup.select("div.medGridProdTitle a"): href = link.get("href") # 处理相对链接,转成可直接访问的绝对链接 full_href = base_url + href if href.startswith('/') else href title = link.get_text(strip=True) # 提取标签内文本并去除多余空格 print(full_href) # print(title) page += 12 cpap_spider(156)
思路2:先找div再定位内部的a标签
如果你还是想先找到div元素,可以在找到div后,用.find('a')方法获取其内部的a标签:
# 替换原代码中的循环部分 for div in soup.findAll("div", {"class":"medGridProdTitle"}): a_tag = div.find('a') if a_tag: # 增加判断,避免部分div无a标签导致报错 href = a_tag.get("href") full_href = base_url + href if href.startswith('/') else href title = a_tag.get_text(strip=True) print(full_href) # print(title)
关键注意点
- 相对链接处理:网站返回的href大概率是相对路径(比如
/catalog/product/xxx),必须和网站的base URL拼接成完整的绝对链接,否则无法直接访问。 - 异常防护:添加
if a_tag:的判断,可以避免因页面结构异常(比如某个div里没有a标签)而抛出AttributeError。 - 文本提取优化:用
link.get_text(strip=True)比link.string更可靠——如果标签内有嵌套元素,string会返回None,而get_text()能提取所有文本内容并自动去除多余空格。
内容的提问来源于stack exchange,提问作者huy
相关产品推荐
相关产品推荐

