2014-11-09 2 views
0

다른 웹 사이트의 뉴스를 자동으로 얻는 데 도움이되는 Python 프로그램을 작성하려고합니다. 현재 나는 원격 페이지를 가져 와서 구문 분석하기 위해 beautifulsoup4 및 urllib3과 함께 python3을 사용하고 있습니다. 내가 디코딩을 시도한은 python3 및 urllib3에서 인코딩 문제가 있습니다.

... 등등 ... 그들은 이러한 à é ó 같은 비 ASCII 문자가 포함되어 있으므로이 페이지의 텍스트를 읽을려고 할 때

문제가 나온다 utf-8에서 페이지를 검색 한 후이를 변수에 넣은 다음 파일을 성공없이 작성합니다 ... 심지어이 문제에 접근하기 위해 다른 방법을 읽은 후에도 작동하는 해결책을 찾을 수 없었습니다.

당신의 사람이 내 같은 상황에 있었던 경우 그때 궁금 해서요 .. 여기

은 그냥 string를 인코딩 및 파일에 쓸 내 코드

# -*- coding: utf-8 -*- 
from bs4 import BeautifulSoup 
import urllib3 

http = urllib3.PoolManager() 
req = http.request('GET', 'http://www.....') 
page = req.data.decode('utf-8') 
soup = BeautifulSoup(page) 

elements = soup.find_all('div', class_='content') 

fp = open('results.xml', 'a') 

for element in elements: 
    link = element.find('a') 
    descr = element.find('div', class_='description') 

    v_link = u'%s' % link.get('href') 
    v_description = u'%s' % descr.text 

    xml = "<news>\n" 
    xml = xml+ " <description>"+ v_description+ "</description>\n" 
    xml = xml+ " <page_link>"+ v_link+ "</page_link>\n" 
    xml = xml+ "</news>\n" 

    fp.write(xml+ '\n') 

#END FOR LOOP 

fp.close() 
+0

예제 URL이 있습니까? – declension

+0

"문제가 발생합니다."문제가 정확히 무엇입니까? 오류가 있습니까? 이게 뭐야? 어느 선 에서요? – shazow

답변

0

이다, 이런 식으로 뭔가 :

desc = 'À à é ó...and so on...'.encode('utf-8') 
with open('utf8.xml', 'a') as f: 
    f.write(desc) 

cat utf8.xml 
À à é ó...and so on... 

SO, 귀하의 경우 아마도 당신은 변경해야

이것에

:

fp.write(xml.encode('utf-8') + '\n') 
0

예없이, 그것은 말하기 어렵다. 비 UTF8 텍스트 (아마도 ISO-8859-1)를 디코딩하거나 BS가 re- 문서의 메타 데이터 (또는 추측)를 기반으로 디코딩하는 것처럼 들립니다. 그 코드에 대한

몇 가지 관련이없는 팁 :

  • 일반 문자열을 사용하여 조심 쓰기 XML합니다. 최소한 v_description 또는 v_link>, <, & 등이 포함 된 경우 잘못된 XML이 생성 될 수 있습니다. 더 나은 방법은 - 프로그래밍 방식으로 XML을 빌드하는 것입니다 (Best way to generate xml? 참조)
  • 최신 파이썬에서는 with 구조를 사용하여 파일이 자동으로 닫히도록 할 수 있습니다.
  • 파이썬에서 문자열을 구성하는 데 +를 사용하지 마십시오. string.Formatter을 사용하십시오. 더 빠르고 읽기 쉽습니다.