使用BeautifulSoup接收用户输入后返回空列表的问题求助
问题原因及解决方案
你的代码返回空列表的核心问题是**find_all的参数传递逻辑错误**:page.find_all(inp, 'a', href=True) 中,第一个参数是标签名,你把用户输入的查询内容放在了这个位置,第二个参数又指定了'a'标签,这相当于在查找「标签名为用户输入内容、同时又是<a>标签」的元素,显然不存在这类元素,所以返回空列表。
针对不同需求的修正方案
根据你想要匹配的内容类型,选择对应的写法:
1. 匹配文本包含用户输入内容的<a>标签(带href)
这是最常见的需求,比如输入"Wikipedia",找到所有文本里包含这个词的链接:
datavar = page.find_all('a', href=True, string=lambda text: text and inp.lower() in text.lower())
lambda text: text and ...:先确保标签存在文本,避免空文本报错- 转小写是为了实现忽略大小写的模糊匹配
也可以用正则实现更灵活的匹配:
import re datavar = page.find_all('a', href=True, text=re.compile(inp, re.IGNORECASE))
2. 匹配属性包含用户输入内容的<a>标签
如果是想找class/id等属性里包含输入内容的链接,比如输入"mw-headline"找对应class的链接:
datavar = page.find_all('a', href=True, class_=lambda c: c and inp in c)
- 注意BeautifulSoup中用
class_而非class,避免和Python关键字冲突
完整修正代码示例
import requests from bs4 import BeautifulSoup import re url = "https://en.wikipedia.org/wiki/Main_Page" resp = requests.get(url).text page = BeautifulSoup(resp, "html.parser") def Get_Links(): inp = input("Enter data you wish to find: ") # 选择下面其中一种写法即可 # 写法1:lambda匹配文本 datavar = page.find_all('a', href=True, string=lambda text: text and inp.lower() in text.lower()) # 写法2:正则匹配文本 # datavar = page.find_all('a', href=True, text=re.compile(inp, re.IGNORECASE)) print(datavar) Get_Links()
内容的提问来源于stack exchange,提问作者somerandomguyhi
相关产品推荐
相关产品推荐

