使用 Python 剥离标签后分配 HTML 内容(正则表达式解析)
Assign HTML content after stripping tags using Python (regex parse)
我想在剥离标签后分配 HTML 的内容。这是我最初从中删除标签的 html:
<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="zero number">0</td>
<td class="skipped number">4</td>
<td class="zero number">0</td>
<td class="passRate suite">
0%
</td>
</tr>
使用正则表达式去除标签的方法:
import re
import os
if os.path.isfile(some_html_file):
with open(some_html_file) as f:
data = f.read()
before = '<td colspan="2" class="totalLabel">Total</td>'
after = '</tr>'
start = data.find(before) + len(before)
stop = data.find(after, start)
d = data[start:stop]
def stripHTMLTags (html):
text = html
rules = [
{ r'>\s+' : u'>'}, # remove spaces after a tag opens or closes
{ r'\s+' : u' '}, # replace consecutive spaces
{ r'[ \t]*<[^<]*?/?>' : u'' }, # remove remaining tags
{ r'^\s+' : u'' } # remove spaces at the beginning
]
for rule in rules:
for (k,v) in rule.items():
regex = re.compile (k)
text = regex.sub (v, text)
return text
print stripHTMLTags(d)
这是我得到的输出:0400%
不过我想把每个HTMLtd标签的内容赋值给变量
所以,我预期的最终输出将是:
A = 0
B = 4
C = 0
D = 0%
分配这些变量的最佳方法是什么?另外,有没有一种方法可以结合正则表达式的规则并使用更简单的正则表达式命令?其他使用正则表达式的方法会有所帮助。
现在您正在删除所有标签文本。您不应该那样做,因为正是标签文本为您提供了识别每个值的开始和结束所需的结构。当每个数字都大于一位数时,你会怎么做? 10384003899 - 前面是 103 还是 10 还是 1038?
而是修改您现有的框架。自己编写一个正则表达式,可以使用 grouping 来提取单个 TD 元素的值。就像是
<td>(.*)</td>
(除了我向你保证这行不通)。然后你可以遍历你的字符串,一次又一次地匹配那个模式直到它失败,将每个匹配附加到一个列表中。完成后,您将获得一个值列表,然后您可以随意对其进行操作。
为了遵循评论并为了完整起见,以下是如何使用 BeautifulSoup
HTML parser 获取总数。
思路是用totalLabel
class找到td
元素,得到next td
siblings:
from bs4 import BeautifulSoup
data = """
<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="zero number">0</td>
<td class="skipped number">4</td>
<td class="zero number">0</td>
<td class="passRate suite">
0%
</td>
</tr>
"""
soup = BeautifulSoup(data, "html.parser")
totals = [td.get_text(strip=True)
for td in soup.find("td", class_="totalLabel").find_next_siblings("td")]
print(totals)
打印:
['0', '4', '0', '0%']
答案不完整(最后一步需要帮助)
my_html_file内容:
<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="zero number">0</td>
<td class="skipped number">4</td>
<td class="zero number">0</td>
<td class="passRate suite">
0%
</td>
</tr>
import re
import os
if os.path.isfile(my_html_file):
with open(my_html_file) as f:
data = f.read()
before = '<td colspan="2" class="totalLabel">Total</td>'
after = '</tr>'
start = data.find(before) + len(before)
stop = data.find(after, start)
d = data[start:stop]
m = re.sub(r'\s+', '', d)
r = re.compile('<tdclass="(.*?)">(.*?)</td>')
k = r.sub(r'\n', m)
print k
这让我:
0
4
0
0%
如何将 r.sub(r'\n', m) 的输出分配给变量,例如:
A = 0
B = 4
C = 0
D = 0%
以上就是我需要的
我想在剥离标签后分配 HTML 的内容。这是我最初从中删除标签的 html:
<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="zero number">0</td>
<td class="skipped number">4</td>
<td class="zero number">0</td>
<td class="passRate suite">
0%
</td>
</tr>
使用正则表达式去除标签的方法:
import re
import os
if os.path.isfile(some_html_file):
with open(some_html_file) as f:
data = f.read()
before = '<td colspan="2" class="totalLabel">Total</td>'
after = '</tr>'
start = data.find(before) + len(before)
stop = data.find(after, start)
d = data[start:stop]
def stripHTMLTags (html):
text = html
rules = [
{ r'>\s+' : u'>'}, # remove spaces after a tag opens or closes
{ r'\s+' : u' '}, # replace consecutive spaces
{ r'[ \t]*<[^<]*?/?>' : u'' }, # remove remaining tags
{ r'^\s+' : u'' } # remove spaces at the beginning
]
for rule in rules:
for (k,v) in rule.items():
regex = re.compile (k)
text = regex.sub (v, text)
return text
print stripHTMLTags(d)
这是我得到的输出:0400%
不过我想把每个HTMLtd标签的内容赋值给变量 所以,我预期的最终输出将是:
A = 0
B = 4
C = 0
D = 0%
分配这些变量的最佳方法是什么?另外,有没有一种方法可以结合正则表达式的规则并使用更简单的正则表达式命令?其他使用正则表达式的方法会有所帮助。
现在您正在删除所有标签文本。您不应该那样做,因为正是标签文本为您提供了识别每个值的开始和结束所需的结构。当每个数字都大于一位数时,你会怎么做? 10384003899 - 前面是 103 还是 10 还是 1038?
而是修改您现有的框架。自己编写一个正则表达式,可以使用 grouping 来提取单个 TD 元素的值。就像是
<td>(.*)</td>
(除了我向你保证这行不通)。然后你可以遍历你的字符串,一次又一次地匹配那个模式直到它失败,将每个匹配附加到一个列表中。完成后,您将获得一个值列表,然后您可以随意对其进行操作。
为了遵循评论并为了完整起见,以下是如何使用 BeautifulSoup
HTML parser 获取总数。
思路是用totalLabel
class找到td
元素,得到next td
siblings:
from bs4 import BeautifulSoup
data = """
<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="zero number">0</td>
<td class="skipped number">4</td>
<td class="zero number">0</td>
<td class="passRate suite">
0%
</td>
</tr>
"""
soup = BeautifulSoup(data, "html.parser")
totals = [td.get_text(strip=True)
for td in soup.find("td", class_="totalLabel").find_next_siblings("td")]
print(totals)
打印:
['0', '4', '0', '0%']
答案不完整(最后一步需要帮助)
my_html_file内容:
<tr class="suite">
<td colspan="2" class="totalLabel">Total</td>
<td class="zero number">0</td>
<td class="skipped number">4</td>
<td class="zero number">0</td>
<td class="passRate suite">
0%
</td>
</tr>
import re
import os
if os.path.isfile(my_html_file):
with open(my_html_file) as f:
data = f.read()
before = '<td colspan="2" class="totalLabel">Total</td>'
after = '</tr>'
start = data.find(before) + len(before)
stop = data.find(after, start)
d = data[start:stop]
m = re.sub(r'\s+', '', d)
r = re.compile('<tdclass="(.*?)">(.*?)</td>')
k = r.sub(r'\n', m)
print k
这让我:
0
4
0
0%
如何将 r.sub(r'\n', m) 的输出分配给变量,例如:
A = 0
B = 4
C = 0
D = 0%
以上就是我需要的