【问题标题】:How to get the code of a contentPlaceHolder programmatically如何以编程方式获取 contentPlaceHolder 的代码
【发布时间】:2012-08-15 11:10:56
【问题描述】:


我希望能够使用任何 Html 解析器提取 contentPlaceHolder 的代码。 问题是,我需要一个 url,但因为它是一个母版页,所以我不能拥有它。

实际上有一个select标签,你可以在其中选择一个选项,当你选择一个时,它会加载一个contentPlaceHolder。我想从 contentPlaceHolder 中提取代码。

注意:我没有建立网站。

这里有一些图片可以更好地解释它:

这是母版页。

这是内容(当你按下红色标志时):

我希望它足够清楚,可以理解...... 谢谢!

【问题讨论】:

  • 如果您要附上页面的 URL,它会更容易为您提供帮助。
  • blich.co.il/timetable-shahaf 是希伯来文,所以你看不懂xD
  • 好吧,幸运的是 HTML 不是用希伯来语编写的 =) - 对于初学者来说,该页面包含一个 IFRAME,其中包含您所追求的内容。
  • @Jens 是的,但我实际上谈到了 IFRAME 里面的内容。有什么方法可以执行我想要的吗?
  • 当然有,这可以用 Jsoup 来完成。我将附上一个简单的示例,列出所有课程。你应该可以从那里去。

标签: java android html master-pages html-content-extraction


【解决方案1】:

首先,这需要JSoup

try {
    // Regexp pattern used to strip the links
    Pattern p = Pattern.compile("\'([^\']*)\'");

    // First, let's find the IFRAME from the main page
    Document doc = Jsoup.connect("http://blich.co.il/timetable-shahaf").get();
    Elements iframe = doc.select("iframe");
    if (!iframe.isEmpty()) {
        String src = iframe.get(0).absUrl("src");
        if (!TextUtils.isEmpty(src)) {
            // Now we need to fetch the contents of the IFRAME
            doc = Jsoup.connect(src).get();

            // This is where we manipulate the <select ..> statement. There's only
            // one on this page, so this will be done quick and dirty
            Elements selects = doc.select("select.HeaderClasses");
            Elements options = selects.select("option");
            if (!options.isEmpty()) {
                // There's a lot of options here.. dunno what they mean, so let's just
                // select a **random** and go with that. Your code should probably let the user
                // choose from a dialog or something.
                Collections.shuffle(options);
                Element option = options.get(0);

                String name=selects.get(0).attr("name");
                if (!TextUtils.isEmpty(name)) {
                    doc = Jsoup.connect(src)
                            .data("__EVENTTARGET", name)
                            .data("__EVENTARGUMENT", "")
                            .data(name, option.attr("value")) // Add random option value
                            .data("__VIEWSTATE", 
                                    doc.select("input#__VIEWSTATE").attr("value"))
                            .data("__LASTFOCUS", "")
                            .post();
                }
            }
            // All the relevant links are stored in a td with the class "HeaderCell"
            Elements links = doc.select("td.HeaderCell a");
            for (Element link : links) {                    
                // These are all links to a silly java-script method, _doPostBack(..)
                // function __doPostBack(eventTarget, eventArgument) {
                //   if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
                //      theForm.__EVENTTARGET.value = eventTarget;
                //      theForm.__EVENTARGUMENT.value = eventArgument;
                //      theForm.submit();
                //   }
                // }
                // The important bits appear to be eventTarget and eventArgument at least,
                // but none of the links define an eventArgument in any case - so we just
                // need "eventTarget".

                // Naïve splitting, take the first quoted string
                Matcher m = p.matcher(link.attr("href"));
                if (m.find()) {
                    String eventTarget = m.group(1);
                    // The eventTarget you're looking for ends with 'ChangesTable'
                    if (eventTarget != null && eventTarget.endsWith("ChangesTable")) {
                        // Now we need to do a POST :-D - this API requires us to retain
                        // __VIEWSTATE - so we need to post that to.
                        doc = Jsoup.connect(src)
                                .data("__EVENTTARGET", eventTarget)
                                .data("__EVENTARGUMENT", "")
                                .data("__VIEWSTATE", 
                                        doc.select("input#__VIEWSTATE").attr("value"))
                                .data("__LASTFOCUS", "")
                                .post();


                        // All the lesson information is stored in a div with the class 
                        // TTLesson, so let's select those
                        Elements lessons = doc.select("div.TTLesson");
                        if (lessons.isEmpty()) {
                            Log.w(TAG, "Unable to list any lessons");
                        } else {
                            for (Element lesson : lessons) {
                                // This is were knowledge of Hebrew would come in handy -
                                // but this will list all lessons. You should be able
                                // to figure out how to find the one you want.
                                System.out.println(lesson);
                            }
                        }
                    }
                }
            }
        } else {
            Log.w(TAG, "Unable to find iframe src");
        }
    } else {
        Log.w(TAG, "Unable to find iframe");
    }
} catch (IOException e) {
    Log.w(TAG, "Error reading timetable", e);
}

这将列出您想要的页面上的所有课程。我将把正确的课程留给你,因为我对希伯来语了解的不够多,无法辨别这些细胞到底包含什么。

编辑:现在示例会在

【讨论】:

  • 这很好,但它专门用于一个班级(学校班级)。当您在网站上时,有一个包含许多课程的下拉菜单。我需要获取特定课程的信息。起初我虽然不可能得到任何班级的时间表,那你是怎么告诉它选择哪个班级的?
  • &lt;select&gt; 就像该页面上的大多数链接一样调用_doPostBack(..) - 您应该能够以与模拟单击“红色事物”类似的方式对其进行操作。选择器的__EVENTTARGETdnn$ctr7919$TimeTableView$ClassesList,它带有一个附加参数dnn$ctr7919$TimeTableView$ClassesList,它有一个整数值,用于标识您选择的类。
  • 如果您在 Chrome 中浏览页面,您可以使用“检查元素”和网络分析器来了解页面的工作方式。对于 Firefox,如果您想编写 HTML 抓取应用程序,“Firebug”插件非常有用。
  • 是的,我有 chrome,过去我想做类似操作的时候它确实对我有帮助,但我只是没有考虑看 JavaScript
  • 很抱歉,我不知道如何更改课程。应该有什么不同?因为在你给我的例子中,它运行在默认的选择值上......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2012-05-25
  • 2010-10-16
  • 2012-03-19
  • 2021-02-14
相关资源
最近更新 更多