使用bs4解析HTML:提取无类/id的含经纬度p标签方法咨询
解决无class/id的经纬度p标签提取问题
嘿,我明白你现在的困境——要抓一个既没class又没id的p标签,还得精准定位到带经纬度的那个。别担心,咱们用BeautifulSoup结合两种思路就能搞定,我给你一步步拆解:
思路1:靠文本内容特征定位
经纬度的文本格式很有辨识度,要么带°、'这类符号,要么会明确出现“Latitude”“Longitude”关键词。咱们可以用正则表达式匹配这些特征,直接锁定目标p标签。
先修正你代码里的小问题(导入顺序和关闭连接的细节),再加上提取逻辑:
from urllib.request import urlopen from bs4 import BeautifulSoup import re my_url = 'http://www.fortwiki.com/Battery_Adair' uClient = urlopen(my_url) page_html = uClient.read() uClient.close() # 记得关闭连接,避免资源占用 page_soup = BeautifulSoup(page_html, "html.parser") # 用正则匹配包含经纬度特征的文本(度数符号、关键词都算) lat_lon_pattern = re.compile(r'(Latitude|Longitude|°|\'|")') target_p = page_soup.find('p', text=lat_lon_pattern) if target_p: print("提取到的经纬度内容:", target_p.get_text(strip=True)) else: print("没找到目标p标签")
思路2:靠页面结构的位置关系定位
如果页面结构比较稳定,这个经纬度p标签大概率在“Location”这类标题的后面。咱们可以先找到对应的标题标签,再取它后面的第一个p标签:
# 先定位到包含"Location"的标题(比如h3) location_title = page_soup.find('h3', string=lambda text: text and 'Location' in text) if location_title: # 取标题后面紧邻的第一个p标签 target_p = location_title.find_next('p') if target_p: print("提取到的经纬度内容:", target_p.get_text(strip=True)) else: print("Location标题后面没有找到p标签") else: print("没找到Location相关的标题")
这两种方法各有优势:正则法适合内容格式固定的场景,位置法适合页面结构稳定的情况,你可以根据实际页面情况选一个用~
内容的提问来源于stack exchange,提问作者Vlad Bogza
相关产品推荐
相关产品推荐

