gpt4 book ai didi

python - 如果 HTML 元素包含一定数量的数字字符,则删除该元素

转载 作者:行者123 更新时间:2023-12-01 08:50:49 25 4
gpt4 key购买 nike

为了使用 Python 将 html 格式的文件转换为纯文本文件,如果表中的文本包含超过 40% 的数字字符,我需要删除所有表。

具体来说,我想:

  1. 识别 html 文件中的每个表格元素
  2. 计算文本中数字和字母字符的数量及其对应比例,不考虑任何 html 标签中的字符。因此,删除所有 html 标签。
  3. 如果表格的文本由超过 40% 的数字字符组成,则删除该表格。如果表格包含的数字字符少于 40%,则保留该表格。

我定义了一个在运行 re.sub 命令时调用的函数。 rawtext 变量包含我想要解析的整个 html 格式的文本。在该函数中,我尝试处理上述步骤,并根据数字字符的比例返回表格的 html 删除版本或空格。然而,函数中的第一个 re.sub 命令似乎不仅删除了标签,还删除了所有内容,包括文本内容。

def tablereplace(table):
table = re.sub('<[^>]*>', ' ', str(table))
numeric = sum(c.isdigit() for c in table)
alphabetic = sum(c.isalpha() for c in table)
try:
ratio = numeric / (numeric + alphabetic)
print('ratio = ' + ratio)
except ZeroDivisionError as err:
ratio = 1
if ratio > 0.4:
emptystring = re.sub('.*?', ' ', table, flags=re.DOTALL)
return emptystring
else:
return table

rawtext = re.sub('<table.+?<\/table>', tablereplace, rawtext, flags=re.IGNORECASE|re.DOTALL)

如果您知道这段代码可能有什么问题,请与我分享,我将非常高兴。谢谢!

最佳答案

正如我在评论中建议的那样,我不会在代码中使用正则表达式来解析和使用 HTML。例如,您可以使用为此目的构建的 python 库,例如 BeautifulSoup .

这是一个如何使用它的示例

#!/usr/bin/python
try:
from BeautifulSoup import BeautifulSoup
except ImportError:
from bs4 import BeautifulSoup
html = """<html>
<head>Heading</head>
<body attr1='val1'>
<div class='container'>
<div id='class'>Something here</div>
<div>Something else</div>
<table style="width:100%">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
</table>
</div>
</body>
</html>"""
parsed_html = BeautifulSoup(html, 'html.parser')
print parsed_html.body.find('table').text

所以你最终可能会得到这样的代码(只是为了给你一个想法)

#!/usr/bin/python
import re
try:
from BeautifulSoup import BeautifulSoup
except ImportError:
from bs4 import BeautifulSoup



def tablereplace(table):
table = re.sub('<[^>]*>', ' ', str(table))
numeric = sum(c.isdigit() for c in table)
print('numeric: ' + str(numeric))
alphabetic = sum(c.isalpha() for c in table)
print('alpha: ' + str(alphabetic))
try:
ratio = numeric / float(numeric + alphabetic)
print('ratio: '+ str(ratio))
except ZeroDivisionError as err:
ratio = 1
if ratio > 0.4:
return True
else:
return False

table = """<table style="width:100%">
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Age</th>
</tr>
<tr>
<td>3241424134213424214321342424214321412</td>
<td>213423423234242142134214124214214124124</td>
<td>213424214234242</td>
</tr>
<tr>
<td>124234412342142414</td>
<td>1423424214324214</td>
<td>2134242141242341241</td>
</tr>
</table>
"""

if tablereplace(table):
print 'replace table'
parsed_html = BeautifulSoup(table, 'html.parser')
rawdata = parsed_html.find('table').text
print rawdata

更新:无论如何,这行代码会删除所有 HTML 标签,正如您所知,因为您将其用于字符/数字计数目的

table = re.sub('<[^>]*>', ' ', str(table))

但这并不安全,因为您的标签文本中也可能有 <>,否则 HTML 可能会被破坏或放错位置

我把它留在了原处,因为对于这个例子来说它正在工作。但请考虑使用 BeautifulSoup 进行所有 HTML 管理。

关于python - 如果 HTML 元素包含一定数量的数字字符,则删除该元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53140405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com