0

次のコード スニペットがあります。URL を取得して開き、テキストだけを解析して、ウィジェットを検索します。ウィジェットを検出する方法は、ウィジェットの終わりを示す単語widget1と を探すことです。endwidget

基本的に、コードは単語を見つけるとすぐにすべてのテキスト行をファイルに書き込み、widget1読み取り時に終了しますendwidget。ただし、私のコードは最初のwidget1行の後のすべての行をインデントしています。

これは私の出力です

widget1 this is a really cool widget
       it does x, y and z 
       and also a, b and c
       endwidget

私が欲しいのは:

widget1 this is a really cool widget
it does x, y and z 
and also a, b and c
endwidget

このインデントが表示されるのはなぜですか? これは私のコードです...

 for url in urls:
        page = mech.open(url)
        html = page.read()
        soup = BeautifulSoup(html)
        text= soup.prettify()
        texts = soup.findAll(text=True) 

        def visible(element):
            if element.parent.name in ['style', 'script', '[document]', 'head', 'title']: 
            # If the parent of your element is any of those ignore it

                return False

            elif re.match('<!--.*-->', str(element)):
            # If the element matches an html tag, ignore it

                return False

            else:
            # Otherwise, return True as these are the elements we need

              return True

        visible_texts = filter(visible, texts)

        inwidget=0
        # open a file for write
        for line in visible_texts:
        # if line doesn't contain .widget1 then ignore it
            if ".widget1" in line and inwidget==0:
                match = re.search(r'\.widget1 (\w+)', line)
                line = line.split (".widget1")[1]   
                # make the next word after .widget1 the name of the file
                filename = "%s" % match.group(1) + ".txt"
                textfile = open (filename, 'w+b')
                textfile.write("source:" + url + "\n\n")
                textfile.write(".widget1" + line)
                inwidget = 1
            elif inwidget == 1 and ".endwidget" not in line:
                print line
                textfile.write(line)
            elif ".endwidget" in line and inwidget == 1:
                textfile.write(line)
                inwidget= 0
            else:
                pass
4

2 に答える 2

1

最初の行を除くすべての行でこのインデントが発生する理由は、行を編集する最初の行ですtextfile.write(".widget1" + line)が、残りの行はインデントを含む html ファイルから直接取得するためです。行でstr.strip()を使用して不要な空白を削除し、に変更textfile.write(line)できtextfile.write(line.strip())ます。

于 2012-11-22T14:45:16.297 に答える
0

出力から目的の出力に移動するには、次のようにします。

#a is your output
a= '\n'.join(map(lambda x: x.strip(),a.split('\n')))
于 2012-11-22T14:34:42.000 に答える