使用python 3.3我試圖讓一些正則表達式替換失敗。如何從HTML td標籤中除去所有屬性,但在Python中使用rowspan?
欲剝離td
標籤的所有屬性,除了rowspan
屬性(例如TD的末)。
使用下面的命令,我可以成功替代時rowspan
存在:
re.sub('(<td)[^>]*([\\s]rowspan[\\s]*=[\\s]*[0-9]*)[^>]*(>)', handle_td, file_contents)
其中handle_td
是:
def handle_td(matchobj):
new_td = ''
for curr_group in matchobj.groups(''):
if curr_group != '':
new_td += curr_group
return new_td
但我想也採取td
的其餘的照顧。這我沒有管理。
如果我在第二組後添加?
,它將td標記更改爲並且不保留rowspan
屬性。
我在做什麼錯?我怎樣才能解決這個問題?
我不開採運行另一個命令來處理其他td
的,但我沒...
<td width=307 valign=top style='width:230.3pt;border:solid windowtext 1.0pt; border-left:none;padding:0cm 5.4pt 0cm 5.4pt'>
<td width=307 rowspan=4 style='width:230.3pt;border:solid windowtext 1.0pt; border-top:none;padding:0cm 5.4pt 0cm 5.4pt'>
<td width=307 valign=top style='width:230.3pt;border-top:none;border-left: none;border-bottom:solid windowtext 1.0pt;border-right:solid windowtext 1.0pt; padding:0cm 5.4pt 0cm 5.4pt'>
這將產生:
<td>
<td rowspan=4>
<td>
我這樣管理(如果你有更好的方法隨時添加它):
# Leave only specific attributes for td tags
def filter_td_attributes(matchobj):
if matchobj.group(1) == "rowspan":
return matchobj.group(1) + '=' + matchobj.group(2)
# Loop the attributes of the td tags
def handle_td(matchobj):
new_td = re.sub("([a-zA-Z]+)[\\s]*=[\\s]*([a-zA-Z0-9:;.\\-'\\s]*)([\\s]|>)", filter_td_attributes, matchobj.group(0))
new_td = re.sub("[\\s]*$", '', new_td)
new_td = new_td + ">" # close the td tag
return new_td
file_contents = re.sub('[\\s]*</p>[\\s]*</td>', '</td>', file_contents)
不要解析HTML/XML與正則表達式。使用解析器,它會*更容易。 – kreativitea
強制性參考:http://stackoverflow.com/a/1732454/1350899 – mata
改用[Beautiful Soup](http://www.crummy.com/software/BeautifulSoup/)。 – will