【问题标题】:Using XPath causing problems使用 XPath 导致问题
【发布时间】:2013-09-22 16:39:45
【问题描述】:

所以我正在学习如何使用 XPath 和 HtmlCleaner 来解析 HTML,但我遇到了一个问题。这是代码:

public class ScheudeleWithDesign extends Activity {

static final String urlToParse = "https://www.easistent.com/urniki/263/razredi/18221";
static final String xpathTableContents = "//div[@id='text11']";
TextView tw1;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_scheudele_with_design);

    tw1 = (TextView) findViewById(R.id.urnikText);

    String value = "";
    value = new getScheudele().execute().toString();
    tw1.setText(value);

}//End of onCreate

private class getScheudele extends AsyncTask<Void, Void, String> {

    @Override
    protected String doInBackground(Void... params) {
        String stats = null;

        //cleaner properties
        HtmlCleaner cleaner = new HtmlCleaner();
        CleanerProperties props = cleaner.getProperties();
        props.setAllowHtmlInsideAttributes(false);
        props.setAllowMultiWordAttributes(false);
        props.setRecognizeUnicodeChars(true);
        props.setOmitComments(true);

        URL url;
        try {
            url = new URL(urlToParse);
            TagNode root = cleaner.clean(url);
            Object[] node = root.evaluateXPath(xpathTableContents);
            //Vzemi podatke če najdeš element
            if (node.length > 0) {
                TagNode resultNode = (TagNode)node[10];
                stats = resultNode.getText().toString();
            }
        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (XPatherException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return stats;
    }

}

所以我显然是在尝试解析某些数据并将其设置为 textview。这不起作用,结果完全错误:

com.whizzapps.stpsurniki.ScheudeleWithDesign$getScheudele@421a7d90

我的猜测是问题出在这里的 XPath 中:

static final String xpathTableContents = "//div[@id='text11']";

我以前从未使用过 XPath,所以我几乎可以肯定我把那部分搞砸了。 This is the site 顺便说一下,我试图从中解析数据。这段代码应该只为初学者获取一个表格元素,一旦我知道该怎么做,我将解析整个表格。

【问题讨论】:

  • "//div[@id='text11']" XPath 正在尝试选择任何 div 元素,其 id 属性等于 text11,但是在引用的 HTML 页面中没有这样的 div 元素。 (有许多 div 元素的类属性设置为 text11。)如果您提供希望从链接的 HTML 页面中选择的数据的具体示例,我们可以帮助您制作 XPath。
  • @kjhughes 我仍在努力学习 XPath,但在学习我一无所知的新东西时总是遇到问题。你能告诉我一个关于如何选择任何表格内容的例子吗?只需向我展示您想要的任何表格内容的 XPath 代码,以便我以某种方式“获取结构”。非常感谢,谢谢!

标签: java android xpath htmlcleaner


【解决方案1】:

我的猜测是问题出在这里的 XPath 中:

static final String xpathTableContents = "//div[@id='text11']";

正如我在评论中提到的,//div[@id='text11'] XPath 正在尝试选择任何 div 元素,其 id 属性等于 text11,但是在引用的 HTML 页面中没有这样的 div 元素。

您能否给我看一个关于如何选择 ANY 表的示例 内容?只需向我展示您想要的任何表格内容的 XPath 代码 我以某种方式“获得了结构”。

使用HTML page you referenced,选择包含“2.ura”的div,例如:

//*[@id="seznam_ur_teden"]/table/tbody/tr[3]/td[1]/div[1]

要只选择那里的文本,

//*[@id="seznam_ur_teden"]/table/tbody/tr[3]/td[1]/div[1]/text()

要选择整个祖先表:

//*[@id="seznam_ur_teden"]/table

【讨论】:

  • 感谢您的回答,很抱歉回复晚了,由于某种原因,我没有在通知中看到它。我尝试了所有这 3 个代码,但没有一个工作。第一个错误是因为“seznam_ur_teden”,因为“不能在里面”。于是我把"改成了',还是不行。
  • 根据HTMLCleaner release notes(2.0 版,但此后没有改进说明),HTMLCleaner 仅部分实现了 XPath。我提供的 XPath 是正确的,并且在 Chrome 中进行了测试。也许其他曾为 HTMLCleaner 的部分 XPath 实现而苦苦挣扎的人会有所了解,但我的建议是使用一个工具,让您不必怀疑您的 XPath 或该工具对标准的实现是否存在问题。
  • 谢谢,我会接受这个建议 :) 我只需用 htmlcleaner 清理我的 html,然后用 jsoup 解析它,如果可以的话。
猜你喜欢
  • 2020-09-04
  • 2016-09-08
  • 1970-01-01
  • 2019-06-21
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多