为何正则匹配宗教人口数据时返回<td>标签而非数字?
问题分析与解决
核心错误原因
你的正则表达式写法完全搞反了捕获目标:
- 你写的
"(<?<td>)[0-9,]*"里,捕获组()把<td>的转义字符<td>包含在内,所以正则只会捕获到<td>标签,而不是后面的数字。 - 另外,你已经将BeautifulSoup节点转为字符串,不需要用
<td>这种转义写法,直接写<td>即可。
修正方案
方案1:修正正则表达式
把获取believers的代码改成下面这样:
# 用捕获组直接抓取<td>标签内的数字部分 believers = re.findall(r"<td>([0-9,]+)", religion_population) # 注意:字符串是不可变类型,replace不会修改原变量,需要重新赋值 believers = [x.replace(",", "") for x in believers] print(believers)
这样就能得到纯数字字符串的列表,要是需要数值类型,再转成int或float即可。
方案2:用BeautifulSoup直接提取(更可靠)
其实没必要把节点转成字符串再用正则,直接用BeautifulSoup的API提取更稳定,避免HTML结构小变动导致正则失效:
religion_table = doc.find(id="religion") # 找到所有<td>标签,提取文本并过滤出数字内容 believers = [td.get_text().strip().replace(",", "") for td in religion_table.find_all("td") if td.get_text().strip().replace(",", "").isdigit()] print(believers)
额外提示
处理HTML解析时,优先用BeautifulSoup的节点查找方法,正则只适合处理纯文本内容,直接用正则匹配HTML字符串很容易因为标签属性、换行等问题出错。
内容的提问来源于stack exchange,提问作者Virtual Adept
相关产品推荐
相关产品推荐

