我正在尝试从HTML源文件中提取一些行。下面的一个简化了,但这是相同的想法。使用下面的示例,我试图以数值顺序输出...(即形式1,表格2,表格3,表格4.(。问题是第二个循环在第二轮重新启动。因此,我得到:表格1,表格2,表格3,表格2。如何编辑,以便第二个循环继续提取表格4文本?
代码
import re
line = 'bla bla bla<form>Form 1</form> some text...<form1>Form
2</form1> more text?bla bla bla<form>Form 3</form> some text...
<form1>Form 4</form1> more text?'
for match in re.finditer('<form>(.*?)</form>', line, re.S):
print match.group(1)
for match1 in re.finditer('<form1>(.*?)</form1>', line, re.S):
print match1.group(1)
break
这是您想要的吗?
>>> for item in re.finditer(r'<form[12]?>([^<]+)',line):
... item.groups()[0]
...
'Form 1'
'Form 2'
'Form 3'
'Form 4'
如果是,只是不要告诉任何人,我的想法是将正则html使用。
for match in re.finditer('<form1?>(.*?)</form1?>', line, re.S):
print(match.group(1))
我修改了代码:
for match in re.finditer('(<form>(.*?)</form>)|(<form1>(.*?)</form1>)', line, re.S):
if None != match.group(4):
print(match.group(4))
else:
print(match.group(2))
返回的match
对象具有一个方法start
,该方法采用了所需组的索引,并返回字符串中匹配组的起始索引(即line
(。然后,您可以通过切片line
(例如line[some_index:]
(,让内部循环从该索引开始,而不是line
的开始。一种更合适,更简单的方法是让您的内部re.finditer
服用match.group(1)
而不是line
。
但是,除非有针对性的HTML的模式足够简单,否则手动处理HTML通常不是一个好主意。您可以在复杂的库中使用一些易于使用的方法来解析和从html中提取数据。