将字符添加到与表达式匹配的行的开头和结尾(Python)

时间:2016-09-06 14:00:06

标签: python

背景:我的任务是从一个网站(主要是HTML表格)中获取内容,然后将其插入到wiki类型的网站中。我能够使用REST API轮询内容(它是动态的)并获得HTML格式的输出。我必须接受此输出,并将其转换为Wiki Markup,然后将其插入新站点。我在转换部分遇到问题。

目前我在我的测试脚本中使用html2text模块,如下所示:

import os
import sys
import html2text

file = raw_input("File to convert: ")

h = html2text.HTML2Text()
with open(file, 'r') as f:
    dataContent = f.read()
    dataConverted = h.handle(dataContent)

with open('tempconvert', 'w') as f:
    f.write(dataConverted)
    #print dataConverted

# Add the | to the line beginnings and endings

with open('tempconvert', 'r') as f:
    tempContent = f.readlines()

with open('finalconvert', 'w') as f:
    for line in tempContent:
        if '|' in line:
            f.write('|' + line.rstrip('\n') + '| \n')

现在,所有这些输入和输出的原因是因为html2text模块没有插入开头或尾随" |" wiki语法需要将其识别为表格。

我的问题是:

  1. 这是非常难看的......如果不写这么多临时文件就可以清理它吗?
  2. 当我使用最终搜索添加" |"时,它只会写入它所依据的行(根据参数,这是有意义的)。我如何让它按照这些方针行事,还要保留其不会对其采取行动的所有其他方面?
  3. 能够获取表格实例中的第一行(你可以告诉这个因为表格之前和之后的空格)对我来说也很棒,并附加一个" ||"为了表示它的标题行。这也可能吗?

2 个答案:

答案 0 :(得分:1)

1:您可以使用split从单个字符串转换为字符串列表来消除临时文件。这样做会产生从每一行中删除\n的副作用,您必须将其添加回去或​​稍后进行说明。

tempContent = dataConverted.split('\n')

2:有两种方法可以解决这个问题。首先是简单地使用else来编写之前跳过的行。 (如果您使用上面的rstrip提示,则无需split

if '|' in line:
    f.write('|' + line + '| \n')
else:
    f.write(line + '\n')

另一种方法是在需要更新时更新该行,然后在任何一种情况下写入。

if '|' in line:
    line = '|' + line + '| '
f.write(line + '\n')

3:这更难,因为您不只是想将这些条添加到空白行后面的任何行,您想要检测到有一个表格即将出现。这意味着你需要某种前瞻性。这是一个可以用来自动向前看的小功能。

def lookahead(seq):
    current = None
    for upcoming in seq:
        if current is not None:
            yield current, upcoming
        current = upcoming
    if current is not None:
        yield current, None

你会这样使用它:

for line, upcoming in lookahead(tempContent):
    if (upcoming and '|' in upcoming) or ('|' in line):
        line = '|' + line + '|'

答案 1 :(得分:0)

第一次尝试:

html = html2text.HTML2Text()
input_file = raw_input('File to convert: ')

with open(input_file, 'r') as input_, open('finalconvert', 'w') as output_:
    data = input_.read()
    data_converted = html.handle(data)

    for line in data_converted.split('\n'):
        if '|' in line:
            line = "|{}|\n".format(line.rstrip())
        output_.write(line.encode())

此代码修复了1和2;但我不明白3。