2014-09-02 2 views
3

저는 지금 당분간이 문제에 시달리고 있습니다. 다음 코드 스 니펫은 일부 웹 사이트의 경우 문자셋이 헤더 메타에 표시 되더라도 None을 반환하므로 웹 페이지의 적절한 문자 집합을 가져 오는 안정적인 방법이 아닌 것 같습니다.urllib2 getparam charset는 일부 사이트에 대해 None을 반환합니다.

conn = urllib2.urlopen(req) 
charset = conn.headers.getparam('charset') 

나는 SO 여기에 여러 스레드를 읽고 일부는 chardet를 사용하는 언급하지만 가능하면 추가 모듈을 가져 오지 않습니다. 대신 머리글 만 다운로드하고 일부 문자열 함수를 사용하여 charset 정보를 얻으려고합니다.

누구에게 더 좋은 아이디어가 있습니까?

답변

2

conn.headers.getparam('charset')은 HTML 콘텐츠 (<meta> 태그)를 구문 분석하지 않으며 HTTP 헤더 (예 : Content-Type)에서만 나타납니다.

http 헤더에 지정되지 않은 경우 use an html parser to get the character encoding이 될 수 있습니다.

+0

감사합니다. 난 그냥 페이지의 헤더를 확인하고 그것은 전혀 문자 세트를 포함하지 않습니다. – g0m3z

+0

누군가 내 솔루션에 관심이 있다면 여기에 붙여 넣으십시오. 정보를 얻기 위해'lxml' 모듈의'cssselect'를 사용합니다 :'charset = site.cssselect ('meta [http-equiv = "Content-Type"]') [0] .get ('content'). split ("charset =", 1) [1]' – g0m3z

+0

@ g0m3z : 자신의 답변으로 게시해야합니다. 왜 html을 이미 완전히 파싱 한 후에 * 문자 인코딩이 필요한가요? 답에서 제공 한 [link] (http://stackoverflow.com/a/15305248/4279)에 따라 인코딩 처리 방법을 확인하십시오. – jfs

0

여기 내 의견을 이동하고 답변으로 게시하십시오.

덕분에 @ J.F. Sebastian 다음 코드 스 니펫을 사용하여 메타 태그에서 캐릭터 세트를 가져올 수 있습니다.

conn = urllib2.urlopen(url) 
site = parse(conn).getroot() 
charset = site.cssselect('meta[http-equiv="Content-Type"]')[0].get('content').split("chars‌​et=",1)[1] 
+0

그것은 제가 제안한 것이 아닙니다. * (http://stackoverflow.com/a/15305248/4279). (저는 답변을 그대로 복사하여 붙여 넣기를 원치 않습니다). – jfs

+0

어쩌면 내 이해가 인코딩/디코딩과 관련하여 올바르지 않습니다. 내가 성취하려고 노력하는 것은 SQLite DB에 3 개의 다른 웹 사이트/인코딩 및 데이터를 저장하는 것입니다. 원래 질문을 게시 한 이유는 모든 데이터를 디버깅 이유로 화면에 출력했기 때문이며 결과는 유니 코드 형식의 문자 인 경우 16 진수 스트림 (예 : \ xef \ xb6 \ x9b)입니다. 어쩌면 전혀 문제가 아니거나 화면에 데이터를 표시하는 데 문제가있을 뿐이므로 웹 사이트에있는대로 DB에 데이터를 저장할 수 있습니다. 데이터를 모두 디코딩해야합니까? 지금까지 도와 줘서 고마워! – g0m3z

+0

링크의 코드를 따르면 유니 코드 문자열로 데이터를 가져올 수 있습니다. 할 수 없다면; 문제를 보여주는 완벽한 최소한의 예제를 제공하십시오. 유니 코드를 표시하거나 데이터베이스에 저장하는 데 문제가 있으면 다른 질문을하십시오. – jfs

관련 문제