2017-12-30 4 views
0

findall을 여러 개 사용하려고 시도하면 index range error이 표시되지만 사용하면 코드가 작동합니다. 파일 객체에 .read()를 호출findall의 여러 인스턴스를 사용할 수 없습니다

from re import findall 
news = open('download7.html', 'r') 

title = findall('<item>[^<]+<title>(.*)</title>', news.read()) 
link = findall('<item>[^<]+<title>[^<]+</title>[^<]+<link>(.*)</link>', news.read()) 
description = findall('<!\[CDATA\[[^<]+<p>(.*)</p>', news.read()) 
pubdate = findall('<pubDate>([^<]+)</pubDate>', news.read()) 
image_regex = findall('url="([^"]+627.jpg)', news.read()) 
print(image_regex[0]) 
+1

첫 번째 통화 후에 빈 목록/Nones가 없습니까? 이것을 확인해 주시겠습니까? 왜 news.read()를 변수에 할당하지 않습니까? 순수한 html 안에 물건을 검색하기 위해 regexes를 사용하는 IMHO는 항상 나쁜 생각입니다. XML과 같은 구조에 전용 모듈을 사용하려고 했습니까? 간단한 xpath를 사용할 수 있기 때문에 더 빠르고 쉬워야합니다. – Arogancky

+0

답장을 보내 주셔서 감사합니다. 나는 정규식을 사용해야한다. 숙제를 좋아하기 때문에 다른 것을 사용할 수 없기 때문이다. 그것은 news.read()를 변수에 할당 한 후에 작동하지만 왜 news.read()를 변수에 할당 한 후에 작동하는지 설명 할 수 있습니까? – alphakiller

답변

1

파일에서 남아있는 모든 데이터를 읽고, 파일 (.read() 반환 빈 문자열로 때문에 후속 호출)의 끝 부분에 파일 포인터를 둡니다.

캐시 파일 내용을 한 번, 그리고 재사용 :

from re import findall 

with open('download7.html', 'r') as news: 
    newsdata = news.read() 

title = findall('<item>[^<]+<title>(.*)</title>', newsdata) 
link = findall('<item>[^<]+<title>[^<]+</title>[^<]+<link>(.*)</link>', newsdata) 
description = findall('<!\[CDATA\[[^<]+<p>(.*)</p>', newsdata) 
pubdate = findall('<pubDate>([^<]+)</pubDate>', newsdata) 
image_regex = findall('url="([^"]+627.jpg)', newsdata) 
print(image_regex[0]) 

참고 : 당신은 (news.seek(0)를 호출) 각 읽기 후에 다시 처음으로 추구하여 파일 객체에서 다시 읽을 수 있지만, 훨씬 적은이다 전체 파일 데이터를 반복해서 필요로 할 때 효율적입니다.

+0

참고 : XML 파서를 실제로 사용하고 있으며 정규 표현식을 사용하더라도 패턴에 원시 문자열을 사용합니다. 하지만이 경우 문제는 정규식이나 파싱과 관련이 없으며 파일을 오용 한 것입니다. – ShadowRanger

+0

작업 중! 고마워요 !!! – alphakiller

관련 문제