2014-09-13 1 views
1

CP1251에서 웹 페이지를 구문 분석하는 데 Gumbo을 사용하고 있습니다. 나는이 텍스트를 UTF-8으로 변환하여 검보 파서로 보냈습니다. 나는 소스가 제대로 콘솔에 표시되는 동안 출력에 이상한 문자를받을A 내부의 검보 HTML 텍스트

node->v.text.text 

A 링크 안에 텍스트를 얻기에 문제가 있습니다. 변환 목적으로 Qt 5.2libiconv을 사용하고 있습니다.

노드 텍스트를 로컬 코드 페이지로 변환해야합니까? 아니면 내가 뭘 잘못하고 있습니까?

if (node->v.element.tag == GUMBO_TAG_DIV && (_class = gumbo_get_attribute(&node->v.element.attributes, "class"))) 
{ 
    if (QString(_class->value) == "catalog-item-title") 
    { 
     qDebug() << "parsePage: found product, parsing..."; 

     GumboVector* children = &node->v.element.children; 
     for (int i = 0; i < children->length; ++i) 
     { 
      GumboNode* node = static_cast<GumboNode*>(children->data[i]); 

      GumboAttribute* href; 
      GumboAttribute* id; 

      if (node->v.element.tag == GUMBO_TAG_A && 
       (href = gumbo_get_attribute(&node->v.element.attributes, "href")) 
      ) 
      { 
       char buf[1024]; 
       memset(buf, 0, 1024); 
       int i = node->v.text.original_text.length; 
       memcpy(buf, node->v.text.original_text.data, i); 


       QString strTitle = buf; 
       Q_ASSERT(node->v.text.original_text.length > 0); 
       qDebug() << "parsePage: found product" << strTitle << href->value; 

       break; 
      } 
     } 
    } 
} 

소스 페이지의 텍스트를 구문 분석 CP1251

QByteArray barrData = pf->getData(); 

    size_t dstlen = 1048576; 
    char buf[dstlen]; 
    memset((char*)buf, 0, dstlen); 

    char* pIn = barrData.data(); 
    char* pOut = (char*)buf; 

    size_t srclen = barrData.size(); 


    iconv_t conv = iconv_open("UTF-8", "CP1251"); 
    iconv(conv, &pIn, &srclen, &pOut, &dstlen); 
    iconv_close(conv); 

    GumboOutput* output = gumbo_parse(buf); 

    parsePage(output->root); 
    gumbo_destroy_output(&kGumboDefaultOptions, output); 

에서

얻기 페이지 : 내가 마지막에 예를 훈제 한

<div class="catalog-item-title"><a href="/textile/postelnoe-bele/korolevskoe-iskushenie-perkal/izmir_2/">Измир 2</a></div> 

답변

1

. 텍스트는 하위 노드에 포함됩니다.

  if (node->v.element.tag == GUMBO_TAG_A && 
       (href = gumbo_get_attribute(&node->v.element.attributes, "href")) 
      ) 
      { 
       QString strTitle; 
       GumboNode* title_text = static_cast<GumboNode>*)(node->v.element.children.data[0]); 
       if (title_text->type == GUMBO_NODE_TEXT) 
       { 
        strTitle = title_text->v.text.text; 
       } 

       qDebug() << "parsePage: found product" << strTitle << href->value; 

       break; 
      } 
+1

Gumbo에 대한 설명서는 어디에서 찾을 수 있습니까? GitHub 페이지는 링크되어 있지 않으며 구글을 통해 찾은이 링크는 http://matze.github.io/clib-doc/gumbo-parser/index.html에별로 도움이되지 않습니다. 예를 들어, GumboOutput 구조체가 어떻게 보이며 어떻게 사용합니까? – Michael

+0

코드가 유용했기 때문에 투표를해야했습니다. –

관련 문제