小能豆

如何从 html 中提取数字?

py

我正在尝试从这个 html 元素中提取数字:

<td bgcolor="green">
    <font color="white">
        "49.8 "
        <small>dBmV</small>
    </font>
</td>

如何仅提取 49.8 而不获取 bBmV?

我能够使用 xpath 返回全部 49.8 dbmv,但是当仅搜索“49.8”的 xpath 时,我收到错误

错误:

invalid selector: The result of the xpath expression "/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font/text()" is: [object Text]. It should be an element. 

我尝试过:

browser.find_element_by_xpath("/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font").text

返回 49.8 dBmV

进而:

browser.find_element_by_xpath("/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font/text()").text

返回上述异常。

我只想要数字 49.8(显然会发生变化)。我知道我可以稍后提取该数字,但我希望有一些东西可以用来直接从 html 中获取详细信息,一些更整洁的东西


阅读 15

收藏
2024-12-09

共1个答案

小能豆

要从这个 HTML 元素中提取出数字 49.8(而不是包括单位的 dBmV),你可以使用以下几种方法。

1. 使用 XPath 结合正则表达式

XPath 本身不支持直接的正则表达式匹配,但可以通过结合 .text 方法和 Python 的正则表达式来实现。

首先,你可以使用 XPath 获取文本内容,然后使用正则表达式从中提取出数字部分。

示例代码:

import re
from selenium import webdriver

# 设置浏览器驱动
driver = webdriver.Chrome()

# 假设你已经打开了页面
driver.get('your_webpage_url')

# 使用XPath获取包含数字和单位的文本
element = driver.find_element_by_xpath("/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font").text

# 使用正则表达式提取数字部分
match = re.search(r'(\d+\.\d+)', element)

if match:
    value = match.group(1)
    print(f"提取的数字是: {value}")
else:
    print("没有找到匹配的数字")

解释:

  • driver.find_element_by_xpath("/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font").text:获取包含 49.8 dBmV 的完整文本。
  • re.search(r'(\d+\.\d+)', element):使用正则表达式从文本中提取一个浮动数字。(\d+\.\d+) 匹配像 49.8 这样的浮动数字。

2. 使用 XPath 和字符串截取(更简洁)

如果你不想使用正则表达式,还可以使用 XPath 来获取文本内容并通过字符串处理来提取数字部分。以下是通过字符串截取的实现方法。

# 使用XPath获取包含文本的元素
element = driver.find_element_by_xpath("/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font").text

# 去掉 'dBmV' 后面的空白字符,保留数字部分
numeric_value = element.split()[0]  # 默认 split() 会按空白字符分割
print(f"提取的数字是: {numeric_value}")

解释:

  • split() 方法会根据空格分隔字符串,这样就可以提取到第一个部分(即数字部分 49.8),忽略掉后面的 dBmV

3. 使用 .find_elements().text (如果文本有多个子元素)

有时,文本可能会分布在不同的子元素中,像你给的 HTML 结构中,"49.8" 是在 <font> 标签内,而 dBmV<small> 标签内。你可以使用 .find_elements() 获取所有子元素的文本内容,然后进行拼接或选择你需要的部分。

# 使用XPath获取所有子元素
elements = driver.find_elements_by_xpath("/html/body/p[1]/table/tbody/tr/td/table[2]/tbody/tr[2]/td[4]/font/*")

# 提取第一个文本节点
value = elements[0].text  # 应该是 '49.8'
print(f"提取的数字是: {value}")

总结:

  1. 正则表达式:非常灵活,可以提取数字并忽略单位。
  2. 字符串处理:如果结构简单,split() 是一个快速有效的方案。
  3. XPath 子元素:当文本分散在不同的子元素中时,可以分别获取并拼接。

这些方法可以帮助你从 HTML 中提取纯数字部分,并根据你的需要进行进一步处理。

2024-12-09