LibXML C ++ XPathEval错误

时间:2015-11-14 19:46:02

标签: html c++ xpath libxml2

首先,我发现我的代码功能有两类问题。我似乎无法使用函数xmlXPathEvalExpression找到正确的元素。另外,我收到的错误类似于:

HTML parser error : Unexpected end tag : a

这似乎是页面中所有标签的内容。

对于某些背景,HTML由CURL提取并在之后立即输入解析功能。为了进行调试,return语句已替换为printf

std::string cleanHTMLDoc(std::string &aDoc, std::string &symbolString) {
    std::string ctxtID = "//span[id='" + symbolString + "']";
    htmlDocPtr doc = htmlParseDoc((xmlChar*) aDoc.c_str(), NULL);
    xmlXPathContextPtr context = xmlXPathNewContext(doc);
    xmlXPathObjectPtr  result = xmlXPathEvalExpression((xmlChar*) ctxtID.c_str(), context);
    if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
        xmlXPathFreeObject(result);
        xmlXPathFreeContext(context);
        xmlFreeDoc(doc);
        printf("[ERR] Invalid XPath\n");
        return "";
    }
    else {
        int size = result->nodesetval->nodeNr;
        for (int i = size - 1; i >= 0; --i) {
            printf("[DBG] %s\n", result->nodesetval->nodeTab[i]->name);
        }
        return "";
    }
}

参数aDoc包含页面的HTML,而symbolString包含我们正在寻找的项目的id;在这种情况下yfs_l84_aapl。我已经确认这是页面上的元素span[id='yfs_l84_aapl']<span id="yfs_l84_aapl">

根据我的阅读,HTML解析器提供的错误是由于缺少命名空间,但在尝试使用XHTML命名空间时,我收到了同样的错误。相反,当使用htmlParseChunk写出DOM树时,由于HTML_PARSE_NOERROR等选项,我不会收到这些错误。但是,htmlParseDoc不接受这些选项。

为了便于获取信息,我正在使用Visual Studio 2015进行编译,并且之前已成功使用此库编译和执行程序。我对格式错误的代码表示歉意。我最近改用了在Eclipse中编写Java。

非常感谢任何帮助!

[编辑]

这不是一个很好的答案,但我做了我想做的工作。我没有通过我的(假设的)不正确的XPath表达式查看DOM,而是逐个标记地移动到最终需要的位置,并在nodeTab属性的nodeSet属性中的正确条目中进行硬编码。 1}}。

代码如下:

std::string StockIO::cleanHTMLDoc(std::string htmlInput) {
    std::string ctxtID = "/html/body/div/div/div/div/div/div/div/div/span/span";
    xmlChar* xpath = (xmlChar*) ctxtID.c_str();
    htmlDocPtr doc = htmlParseDoc((xmlChar*) htmlInput.c_str(), NULL);
    xmlXPathContextPtr context = xmlXPathNewContext(doc);
    xmlXPathObjectPtr  result = xmlXPathEvalExpression(xpath, context);
    if (xmlXPathNodeSetIsEmpty(result->nodesetval)) {
        xmlXPathFreeObject(result);
        xmlXPathFreeContext(context);
        xmlFreeDoc(doc);
        printf("[ERR] Invalid XPath\n");
        return "";
    }
    else {
        xmlNodeSetPtr nodeSet = result->nodesetval;
        xmlNodePtr nodePtr = nodeSet->nodeTab[1];
        return (char*) xmlNodeListGetString(doc, nodePtr->children, 1);
    }
}

我会打开这个问题,希望有人能帮助我详细说明我在设置XPath表达式时做错了什么。

0 个答案:

没有答案