【问题标题】:How to replace HTML tags using regexps in R, without using function in replacement? [closed]如何在 R 中使用正则表达式替换 HTML 标签,而不使用替换函数? [关闭]
【发布时间】:2017-06-30 02:52:04
【问题描述】:

我正在尝试将<td> 标签替换为:仅<td> 如果它们没有背景颜色信息,则仅<td backgrouond:'color' > 如果存在背景颜色信息。在这两种情况下,删除 td 标记中的所有其他内容。

可重现的例子:

<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=513 style='width:385.0pt;margin-left:-.15pt;border-collapse:collapse'>
<tr style='height:15.0pt'>
<td width=411 nowrap style='width:308.0pt;border:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>hdinka</td>
<td width=103 nowrap valign=bottom style='width:77.0pt;border:solid windowtext 1.0pt;border-left:none;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>kya</td>
</tr>
<tr style='height:15.0pt'>
<td width=411 nowrap style='width:308.0pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>chika</td>
<td width=103 nowrap valign=bottom style='width:77.0pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:red;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>&nbsp</td>
</tr>
<tr style='height:15.0pt'>
<td width=411 nowrap style='width:308.0pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>pongal</td>
<td width=103 nowrap valign=bottom style='width:77.0pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>hawk</td>
</tr>
</table>

因此,如果&lt;td&gt; 标记中有任何背景,则正则表达式结果应该是这样的:&lt;td style='background:red;'&gt;,如果没有背景,那么结果应该只是&lt;td&gt;

这可以在不使用替换功能的情况下完成吗?如果没有,请告诉如何。

【问题讨论】:

  • 所以如果 标记中有任何背景,则正则表达式结果应该是这样的:&lt;td style='background:red;'&gt; ?
  • @shove 完全正确。如果没有背景,那么结果应该只是
  • 什么? "something like this:" 这个在哪里?
  • @MYGz 我真的很抱歉,因为它是 html 标签,它被网页作为 html 读取。现在我把它放在引号里,所以它应该是可见的
  • 这几乎是不可能的,因为您的大部分&lt;tags&gt; 在您的问题中不可见。在发布之前,请始终使用预览窗口确保您的问题可以理解。

标签: python html r regex


【解决方案1】:

你可以试试这样的 BeautifulSoup:

import re
from bs4 import BeautifulSoup

html="""<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=513 style='width:385.0pt;margin-left:-.15pt;border-collapse:collapse'>
<tr style='height:15.0pt'>
<td width=411 nowrap style='width:308.0pt;border:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>hdinka</td>
<td width=103 nowrap valign=bottom style='width:77.0pt;border:solid windowtext 1.0pt;border-left:none;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>kya</td>
</tr>
<tr style='height:15.0pt'>
<td width=411 nowrap style='width:308.0pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>chika</td>
<td width=103 nowrap valign=bottom style='width:77.0pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;background:red;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>&nbsp</td>
</tr>
<tr style='height:15.0pt'>
<td width=411 nowrap style='width:308.0pt;border:solid windowtext 1.0pt;border-top:none;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>pongal</td>
<td width=103 nowrap valign=bottom style='width:77.0pt;border-top:none;border-left:none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt;padding:0in 5.4pt 0in 5.4pt;height:15.0pt'>hawk</td>
</tr>
</table>"""

soup=BeautifulSoup(html, 'html.parser')
for a in soup.find_all('td'):
    if 'background' in a.attrs['style']:
        b = re.findall(r'background:\w+', a.attrs['style'])
        a.attrs={}
        a.attrs['style'] = b[0]
    else:
        a.attrs={}
print soup

输出:

<table border="0" cellpadding="0" cellspacing="0" class="MsoNormalTable" style="width:385.0pt;margin-left:-.15pt;border-collapse:collapse" width="513">
<tr style="height:15.0pt">
<td>hdinka</td>
<td>kya</td>
</tr>
<tr style="height:15.0pt">
<td>chika</td>
<td style="background:red"> </td>
</tr>
<tr style="height:15.0pt">
<td>pongal</td>
<td>hawk</td>
</tr>
</table>

或者只使用没有 BeautifulSoup 的 re 模块,你可以这样做:

import re

res = re.sub(r'(<td)(?!.*background).*?(>)', r'\1\2', html)
res = re.sub(r'<td.*(background:\w+).*?>', r'<td style="\1">', res)
print res

输出:

<table class=MsoNormalTable border=0 cellspacing=0 cellpadding=0 width=513 style='width:385.0pt;margin-left:-.15pt;border-collapse:collapse'>
<tr style='height:15.0pt'>
<td>hdinka</td>
<td>kya</td>
</tr>
<tr style='height:15.0pt'>
<td>chika</td>
<td style="background:red">&nbsp</td>
</tr>
<tr style='height:15.0pt'>
<td>pongal</td>
<td>hawk</td>
</tr>
</table>

如果你想对所有标签都这样做,而不仅仅是&lt;td&gt;,你可以这样尝试:

res = re.sub(r'(<\w+)(?!.*background).*?(>)', r'\1\2', html)
res = re.sub(r'(<\w+).*(background:\w+).*?>', r'\1 style="\2">', res)
print res

输出:

<table>
<tr>
<td>hdinka</td>
<td>kya</td>
</tr>
<tr>
<td>chika</td>
<td style="background:red">&nbsp</td>
</tr>
<tr>
<td>pongal</td>
<td>hawk</td>
</tr>
</table>

【讨论】:

    猜你喜欢
    相关资源
    最近更新 更多
    热门标签