使用BeautifulSoup与urllib抓取网页表格后,如何拆分文字与数字?
解决表格抓取后字符串拆分问题
我来帮你搞定这个问题!你现在遇到的是抓取表格数据时,没有正确解析单元格内容,导致所有文本揉成了一串,咱们分两步解决:先处理已经得到的连续字符串,再优化抓取代码从根源避免这个问题。
一、处理已有的连续字符串
首先咱们先把你拿到的字符串里的"Index"去掉,再拆分省份和对应的数字。这里用正则表达式最方便,因为省份都是首字母大写的单词,数字是带小数点的格式,刚好可以精准匹配:
import re # 你得到的原始字符串 original_str = "IndexAceh5.82Bali6.23Banten5.85Bengkulu4.81DKI6." # 第一步:移除"Index" clean_str = original_str.replace("Index", "") # 第二步:用正则匹配省份和数字 # 正则规则:匹配首字母大写的单词(省份),紧跟一个带小数点的数字 pattern = re.compile(r'([A-Z][a-zA-Z]+)(\d+\.\d+)') matches = pattern.findall(clean_str) # 拆分到两个列表 prov = [item[0] for item in matches] number = [float(item[1]) for item in matches] # 输出结果 print("省份列表:", prov) print("数字列表:", number)
运行这段代码后,你就能得到分开的prov和number列表啦。如果最后那个"DKI6."是不完整的数字(比如应该是6.xx),正则会自动忽略它,避免引入错误数据。
二、优化抓取代码,从根源避免连续字符串
其实你一开始就不用先拿到这种乱糟糟的字符串,直接遍历表格的行和单元格提取内容更靠谱。我帮你完善一下抓取部分的代码:
import urllib2 from bs4 import BeautifulSoup quote_page = "MY LINK" # 替换成你的目标链接 page = urllib2.urlopen(quote_page) soup = BeautifulSoup(page, 'html.parser') # 找到目标表格(你可以根据实际情况调整,比如用class或者id定位) # 假设你的表格有个id叫"province-data-table",如果没有就用soup.find('table')取第一个表格 target_table = soup.find('table', id="province-data-table") prov = [] number = [] # 遍历表格的每一行,跳过表头行(如果表头是<tr>里的<th>的话) for row in target_table.find_all('tr'): # 获取当前行的所有单元格 cells = row.find_all('td') # 确保至少有两个单元格(省份+数字) if len(cells) >= 2: # 提取省份名称,strip()去掉多余空格 province_name = cells[0].get_text(strip=True) # 提取数字并转成浮点数 try: province_num = float(cells[1].get_text(strip=True)) # 只有内容有效时才添加到列表 if province_name: prov.append(province_name) number.append(province_num) except ValueError: # 如果数字格式不对,跳过或者记录错误 print(f"无法解析{province_name}的数字:{cells[1].get_text()}") print("省份列表:", prov) print("数字列表:", number)
这段代码会直接从表格的单元格里提取内容,不会出现文本连在一起的情况,还能处理一些格式错误的情况,比先拿到连续字符串再拆分要靠谱得多。
内容的提问来源于stack exchange,提问作者Ade Guntoro
相关产品推荐
相关产品推荐

