Python BeautifulSoup如何提取h2标签内不含嵌套子标签的主文本
问题解决方法
核心原因
你直接调用h2标签的.text属性时,BeautifulSoup会自动把该标签下所有后代节点(包括内部的<small>标签)的文本内容拼接在一起返回,这就是你得到「币种名+缩写」合并结果的原因。另外你贴出的代码里写的.text[0]属于笔误,这个写法只能取到文本的第一个字符,和你给出的输出结果不符,实际运行时你应该是没加[0]。
解决方案
有两种常用的实现方式,任选一种修改你get_name函数里的提取逻辑即可:
方式1:直接取h2的第一个直接子文本节点
用.contents属性获取h2标签的所有直接子节点列表,第一个元素就是你要的纯币种名文本:
def get_name(url): start_url = "https://coinmarketcap.com/all/views/all/" url = urljoin(start_url, url) response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") # 取第一个直接子节点的文本,用strip()去掉首尾空白字符 name = soup.find('h2', class_="sc-1q9q90x-0 jCInrl h1").contents[0].strip() print(name) return name # 补充return,否则外部接收的name都是None
方式2:先删除内部的small标签再提取文本
先找到h2内部的small标签,调用.decompose()方法把它从DOM树中移除,再提取h2的文本就是纯币种名:
def get_name(url): start_url = "https://coinmarketcap.com/all/views/all/" url = urljoin(start_url, url) response = requests.get(url) soup = BeautifulSoup(response.text, "html.parser") h2_tag = soup.find('h2', class_="sc-1q9q90x-0 jCInrl h1") # 移除内部的small标签 h2_tag.find('small', class_="nameSymbol").decompose() name = h2_tag.text.strip() print(name) return name
额外优化建议
你当前的实现每爬一个币种就要发一次详情页请求,效率很低,其实列表页的<tr>行内本身就包含币种全名和缩写信息,不需要跳转详情页提取,可以大幅减少请求次数提升爬取效率。
内容的提问来源于stack exchange,提问作者MxclFhn
相关产品推荐
相关产品推荐

