使用Python Beautiful Soup提取href返回None,求解决方法
解决Beautiful Soup提取href返回None的问题
嘿,我来帮你搞定这个坑!你说能筛选到目标article节点,但调用url.get('href')返回None,大概率是这几个原因,咱们一步步排查:
1. 你选中的article标签本身根本没有href属性
很多时候,商品卡片类的article标签只是个容器,真正的链接是放在它内部的<a>标签里的。你可以先把选中的article节点打印出来看看结构——比如用print(article.prettify()),就能清楚看到href到底在哪个子节点上。
举个例子,如果你的HTML结构是这样的:
<article> <div class="product-info"> <h3>Gonz Logo Black</h3> <a href="/product/gonz-logo-black" class="product-link">查看详情</a> </div> </article>
那你直接取article的href肯定是None,得先找到里面的<a>标签再拿href。
2. 文本匹配的逻辑可能有偏差
你用的筛选条件是不是只匹配了article标签直接包含的文本?如果“Gonz Logo”和“Black”是在article的子元素(比如h3、p)里,那text=lambda...的匹配可能没问题,但还是要确认选中的节点是不是你预期的那个。
修正后的代码示例
给你改个能拿到href的版本,你可以根据实际HTML结构调整:
from bs4 import BeautifulSoup # 假设你的页面内容存在html变量里 soup = BeautifulSoup(html, 'html.parser') # 先筛选包含目标文本的article target_articles = soup.find_all( 'article', text=lambda t: t and 'Gonz Logo' in t and 'Black' in t ) for article in target_articles: # 查找article下的第一个a标签(如果有特定class可以加上,比如find('a', class_='product-link')) link_tag = article.find('a') if link_tag: # 提取href,get()比直接用[]更安全,不会因为属性不存在报错 product_href = link_tag.get('href') print(f"找到链接:{product_href}") else: print("这个article里没找到a标签哦")
如果上面的方式还是不行,你可以换一种筛选逻辑:先遍历所有article,再检查它的文本内容里是否包含关键词,然后找a标签:
for article in soup.find_all('article'): # 提取article的所有文本并去除空格 article_text = article.get_text(strip=True) if 'Gonz Logo' in article_text and 'Black' in article_text: link_tag = article.find('a') if link_tag: print(link_tag.get('href'))
关键还是要先看清楚你选中的article的HTML结构,确认href的位置,问题就能迎刃而解啦!
内容的提问来源于stack exchange,提问作者lucky simon
相关产品推荐
相关产品推荐

