0

Google の appengine API を使用しています

from google.appengine.api import urlfetch

ウェブページを取得します。結果として

result = urlfetch.fetch("http://www.example.com/index.html")

html コンテンツの文字列です (result.content 内)。問題は、解析したいデータが実際には HTML 形式ではないことです。そのため、python HTML パーサーを使用してもうまくいかないと思います。HTML ドキュメントの本文にあるすべてのプレーン テキストを解析する必要があります。唯一の問題は、urlfetch が HTML ドキュメント全体の単一の文字列を返し、すべての改行と余分なスペースが削除されることです。

EDIT: さて、私は別のURLを取得しようとしましたが、どうやらurlfetchは改行を削除しません.HTMLファイルをそのように提供したのは、解析しようとしていた元のWebページでした... 編集終了

ドキュメントが次のような場合:

<html><head></head><body>
AAA 123 888 2008-10-30 ABC
BBB 987 332 2009-01-02 JSE
...
A4A       288        AAA
</body></html>

urlfetch が取得した後、result.content は次のようになります。

'<html><head></head><body>AAA 123 888 2008-10-30 ABCBBB 987     2009-01-02 JSE...A4A     288            AAA</body></html>'

HTML パーサーを使用しても body タグ間のデータは役に立たないので、正規表現を使用してデータを解析するつもりでしたが、ご覧のとおり、1 行の最後の部分が次の行の最初の部分と結合されます。 、そしてそれを分割する方法がわかりません。私は試した

result.content.split('\n')

result.content.split('\r')

しかし、結果のリストはすべて 1 つの要素だけでした。Google の urlfetch 関数には、改行を削除しないオプションがありません。

このデータを解析する方法はありますか? 多分私はそれを別の方法で取得する必要がありますか?

前もって感謝します!

4

5 に答える 5

2

ドキュメントの形式はあなたが投稿したものであることを理解しています。その場合、BeautifulSoupのようなパーサーは良い解決策ではないかもしれないことに同意します。

次のような正規表現を使用して、(BODYタグ間で)興味深いデータをすでに取得していると思います。

import re
data = re.findall('<body>([^\<]*)</body>', result)[0]

次に、次のように簡単にする必要があります。

start = 0
end = 5
while (end<len(data)):
   print data[start:end]
   start = end+1
   end = end+5
print data[start:]

(注:境界の場合に対してこのコードをチェックしなかったので、失敗することを期待しています。ここでは一般的な考え方を示しています)

于 2009-01-03T21:13:07.360 に答える
2

私が考えることができる唯一の提案は、固定幅の列があるかのように解析することです。HTML では改行は考慮されません。

ソース データを制御できる場合は、HTML ではなくテキスト ファイルに入れます。

于 2009-01-03T20:36:30.413 に答える
1

本文が1つの長い文字列になったら、次のように分割できます。これは、各レコードが26文字であることを前提としています。

body= "AAA 123 888 2008-10-30 ABCBBB 987     2009-01-02 JSE...A4A     288            AAA"
for i in range(0,len(body),26):
    line= body[i:i+26]
    # parse the line
于 2009-01-04T00:18:04.413 に答える
0

編集:読解は望ましいことです。線の間に区切り文字がない状態で線が一緒に走っているという点を少し見逃しました。これが全体のポイントになりますね。だから、私の答えを気にしないでください、それは実際には関係ありません。


各行が5つのスペースで区切られた列であることがわかっている場合は、(htmlを削除したら)次のようにすることができます(テストされていない)。

def generate_lines(datastring):
    while datastring:
        splitresult = datastring.split(' ', 5)
        if len(splitresult) >= 5:
            datastring = splitresult[5]
        else:
            datastring = None
        yield splitresult[:5]

for line in generate_lines(data):
    process_data_line(line)

もちろん、必要に応じて分割文字と列数を変更し(場合によっては、追加のパラメーターとしてジェネレーター関数に渡すこともできます)、必要に応じてエラー処理を追加できます。

于 2009-01-04T01:08:14.500 に答える
0

s文字列を 26 文字のブロックに分割するためのその他の提案:

リストとして:

>>> [s[x:x+26] for x in range(0, len(s), 26)]
['AAA 123 888 2008-10-30 ABC',
 'BBB 987     2009-01-02 JSE',
 'A4A     288            AAA']

ジェネレーターとして:

>>> for line in (s[x:x+26] for x in range(0, len(s), 26)): print line
AAA 123 888 2008-10-30 ABC
BBB 987     2009-01-02 JSE
A4A     288            AAA

が非常に長い場合は、Python 2.x でrange()置き換えます。xrange()s

于 2009-01-27T21:52:46.303 に答える