使用BeautifulSoup抓取经纬度值的代码故障排查求助
问题排查与解决方案
让我帮你一步步找出代码里的问题,然后给出修复后的版本:
代码里的核心问题
- 未定义变量错误:你用了
for item in info:循环,但info这个变量根本没被定义——你前面找元素的结果存在longitude_findall里了,变量名不匹配会直接抛出NameError。 - 元素定位范围太宽:
div.tab-content是页面里的大容器,包含很多无关内容,直接找这个容器再遍历效率低,而且容易找不到目标元素。 - 未提取实际文本值:就算找到了目标
span标签,你直接打印的是BeautifulSoup的Tag对象,不是经纬度的数值文本。 - 未利用初始化的列表:你创建了
Latitude和Longitude列表,但没有把提取到的值添加进去,最后没法保存结果。
修复后的代码
from bs4 import BeautifulSoup import requests headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/102.0.0.0 Safari/537.36'} latitude_list = [] longitude_list = [] url = 'http://www.geonames.org/5549030' # 发送请求并解析页面 r = requests.get(url, headers=headers) soup = BeautifulSoup(r.text, 'html.parser') # 直接定位到带有latitude和longitude类的span元素 latitude_tag = soup.find('span', class_='latitude') longitude_tag = soup.find('span', class_='longitude') # 提取文本并添加到列表(做非空判断避免报错) if latitude_tag: latitude = latitude_tag.get_text(strip=True) latitude_list.append(latitude) print(f"纬度: {latitude}") if longitude_tag: longitude = longitude_tag.get_text(strip=True) longitude_list.append(longitude) print(f"经度: {longitude}")
代码说明
- 修正了变量名不匹配的问题,改成直接定位目标元素(这个页面里只有一组经纬度,不需要
find_all遍历)。 - 直接用
class_='latitude'和class_='longitude'定位,比用title属性更精准,也符合页面的实际结构。 - 用
get_text(strip=True)提取标签里的文本,同时去掉多余的空格和换行符。 - 添加了非空判断,避免因为页面结构变化导致找不到元素时抛出错误。
- 把提取到的值添加到对应的列表里,方便后续使用。
内容的提问来源于stack exchange,提问作者AG10
相关产品推荐
相关产品推荐

