문제

Google의 Appengine API를 사용하고 있습니다

from google.appengine.api import urlfetch

웹 페이지를 가져 오기 위해. 결과

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

HTML 컨텐츠의 문자열입니다 (result.content). 문제는 구문 분석하고 싶은 데이터가 실제로 HTML 형식이 아니기 때문에 Python HTML Parser를 사용하는 것이 나에게 효과가 있다고 생각하지 않습니다. HTML 문서의 본문에서 모든 일반 텍스트를 구문 분석해야합니다. 유일한 문제는 urlfetch가 전체 HTML 문서의 단일 문자열을 반환하여 모든 최신 라인과 추가 공간을 제거한다는 것입니다.

편집하다:좋아, 나는 다른 URL을 가져 오려고 시도했고 분명히 Urlfetch는 Newlines를 벗기지 않았다. 그것은 HTML 파일을 그런 식으로 제공 한 원래 웹 페이지였습니다 ...최종 편집

문서가 다음과 같은 경우 :

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

urlfetch가 가져온 후 다음이 될 것입니다.

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

HTML Parser를 사용하면 본문 태그 사이의 데이터에 도움이되지 않으므로 정기적 인 수용량을 사용하여 데이터를 구문 분석 할 것입니다. 그러나 한 줄의 마지막 부분이 다음 줄의 첫 번째 부분과 결합됩니다. 그리고 나는 그것을 분할하는 방법을 모른다. 나는 시도했다

result.content.split('\n')

그리고

result.content.split('\r')

그러나 결과 목록은 모두 단지 1 요소였습니다. Google의 Urlfetch 함수에 신축성을 제거하지 않는 옵션이 표시되지 않습니다.

이 데이터를 어떻게 구문 분석 할 수 있습니까? 어쩌면 다르게 가져와야할까요?

미리 감사드립니다!

도움이 되었습니까?

해결책

문서의 형식은 귀하가 게시 한 형식이라는 것을 이해합니다. 이 경우 파서가 좋아한다는 데 동의합니다. 아름다운 수프 좋은 해결책이 아닐 수도 있습니다.

나는 당신이 이미 정기적 인 표현으로 흥미로운 데이터 (신체 태그 사이)를 받고 있다고 가정합니다.

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:]

(참고 : 경계 사례에 대해이 코드를 확인하지 않았으며 실패 할 것으로 예상합니다. 일반적인 아이디어를 보여주기 위해 여기에 있습니다).

다른 팁

내가 생각할 수있는 제안만이 고정 너비 열이있는 것처럼 구문 분석하는 것입니다. HTML에 대한 신생은 고려되지 않습니다.

소스 데이터를 제어 할 경우 HTML 대신 텍스트 파일에 넣으십시오.

바디 텍스트를 단일 긴 줄로 가지고 있으면 다음과 같이 분해 할 수 있습니다. 이것은 각 레코드가 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

편집 : 독해력은 바람직한 것입니다. 나는 그들 사이에 분리기가없는 선이 함께 실행되는 것에 대해 조금 놓쳤다. 이것은 이것의 요점이 될 것입니까? 따라서 내 대답을하지 마십시오. 실제로 관련이 없습니다.


각 라인이 5 개의 공간 분리 된 열인 것을 알고 있다면 (HTML을 제거하면) (Untested)와 같은 것을 할 수 있습니다.

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)

물론 필요에 따라 분할 문자와 열 수를 변경할 수 있습니다 (아마도 발전기 기능으로 추가 매개 변수로 전달할 수도 있음).

문자열을 분할하기위한 추가 제안 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

바꾸다 range() ~와 함께 xrange() Python 2.X에서 s 매우 길다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top