首先,我发现我的代码功能有两类问题。我似乎无法使用函数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表达式时做错了什么。