2014-05-21 3 views
0

저는 파이썬과 sqlite 사이의 유니 코드 지옥에 깊이 빠졌습니다. 나는 간단하다고 생각하는 것을 시도하고있다 :파이썬 문자열/유니 코드 객체를 sqlite에 전달하십시오.

1) scrapy ==> 2) 웹 사이트를 긁어 낸다. lxml ==>로 메인 텍스트 내용을 추출한다. 3) SQLite 데이터베이스에 텍스트를 전달한다.

처음 두 단계는이 코드를 사용하여 간단하다 :

class OpEdSpider(BaseSpider): 
    name = "opeds" 
    allowed_domains = ["scrapy.org"] 
    start_urls = ["http://doc.scrapy.org/en/latest/intro/tutorial.html"] 

    def parse(self, response): 
    data = response.body 
    into_lxml = html.fromstring(data) 
    raw_content = unicode(into_lxml.text_content()) 
    print raw_content 

첫 번째 부분은 사이트를 긁어 파이썬의 scrapy 라이브러리를 사용을; 구문 분석 함수는 lxml의 text_content() 속성을 통해 상당히 깨끗한 텍스트를 추출합니다 (정확한 html/xml 구조에는 관심이 없지만이 기능을 통해 나를 분석 할 때 사용할 수있는 깨끗한 텍스트). raw_content 또는 unicode()이 포함되거나 포함되지 않은 인쇄는 원하는 방식으로 원하는 내용을 표시합니다. type(raw_content)은 예상대로 각각 lxml.etree._* 또는 unicode입니다.

class OpEdSpider(BaseSpider): 
    name = "opeds" 
    allowed_domains = ["scrapy.org"] 
    start_urls = ["http://doc.scrapy.org/en/latest/intro/tutorial.html"] 

    def parse(self, response): 
    data = response.body 
    into_lxml = html.fromstring(data) 
    raw_content = unicode(into_lxml.text_content(),) 
    add_to_db(raw_content) 

def add_to_db(item): 
    conn = sqlite3.connect('testproject_tracker.db') 
    c = conn.cursor() 

    c.execute('''CREATE TABLE if not exists tracker 
      (web_content TEXT)''') 

    c.execute("INSERT INTO tracker VALUES (?)", (item,)) 

    conn.commit() 

    for row in c.execute('SELECT * from tracker'): 
    print row 

    conn.close() 

잘 세척 업되는 출력을 raw_content에서 사용 여기에서 A의 (지금은 끔찍 :이 기능으로 print 기능을 대체 SQLite는 데이터베이스에 raw_content를 추가하려고하면

상황이 붕괴 작은 샘플) :

\n\'Example title\'\n\n\nSpiders are expected to return their scraped data inside\nItem objects.

그리고 여기는 내가 잃어버린 부분입니다. raw_content은 유니 코드 텍스트 객체입니다. SQLite 열 (web_content)은 유니 코드를 받아들입니다. 어딘가에 raw_content은 위의 엉망으로 인코딩/디코딩됩니다.

나는 문제가 무엇인지 이해하지만 해결 방법이 아니라고 생각하는 시점까지이를 조사했습니다. 그러나 제가 잘못하면 저를 교정하십시오. raw_content은 sqlite *에 튜플로 전달되어 raw_content 변수의 구조화되지 않은 텍스트를 튜플의 개별 요소 (줄 수는 없습니까?)로 분할하고 \n 및 기타 문자열로 데이터베이스에 구분합니다. 어떻게 피할 수 있습니까? raw_content을있는 그대로 SQLite에 전달할 수 있습니까? 즉 데이터베이스에 전달되기 전에 정확하게 어떤 인쇄 raw_content이 표시되는지를 데이터베이스에 전달하는 것입니다.

오랜 질문에 사과드립니다. 나는 다른 사람들이 내가 시도한 실패한 솔루션을 복제하지 못하도록 세부 사항과의 간결성을 조화 시키려고 노력하고있다.

[* (내가 후행 ,를 제거하면) 내가 튜플로 raw_content을 통과하지 않는 경우에, 나는 다음과 같은 오류 얻을 :

sqlite3.ProgrammingError: Incorrect number of bindings supplied. The current statement uses 1, and there are 25741 supplied.

]

답변

0

print row[0]

I 시도를 문자열이 실제로는 괜찮다고 생각합니다 ... 행은 목록이므로 문자열 자체가 아닌 문자열의 repr을 봅니다.

>>> x = ["hello\nworld"] #essentially equivelent to your row variable 
>>> print x 
['hello\nworld'] #this is likely simillar to what you are seeing 
>>> print x[0] #when you want to see this 
hello 
world 

내 생각 엔 ... (예. 그 인코딩/아무것도, 원시 바이트를 저장하지만, 생각하지 말아요 ... select 문을 목록을 반환합니다 ... 목록을 인쇄하는 실제 목록을 인쇄하는 대신 목록에있는 항목의 repr을 인쇄합니다)

+0

작동 아름답게, 고마워!텍스트는 데이터베이스 내에서 정확하게 저장되지만, 파이썬의 인쇄물은 나에게 뭔가 잘못되었다고 생각하게했다. 이 솔루션을 사용하면 둘 다 올바르게 저장하고 저장할 수 있습니다. –

관련 문제