android - JSoup如何选择和获取具体信息

标签 android html regex jsoup

我正在尝试选择特定的 html 信息并将其放入变量中。但首先我会尽我所能展示这些信息。问题是我要提取信息的页面没有明确的类标识符,或者我很难知道如何提取该信息。

这是我的 Jsoup 代码:

    public class MainActivity extends Activity {

    private TextView tvmaximo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvmaximo=(TextView)findViewById(R.id.tvmaximo);

        new BackGroundTask().execute();

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



    class BackGroundTask extends AsyncTask<Void, Void, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected String doInBackground(Void... params) {

            try {
               URL url= new URL("http://www.myweb.com");
               /*Document doc = Jsoup.connect(url.toString()).get();*/
               Document doc = Jsoup.connect(url.toString()).get();
               /*Elements elements = doc.select(".lyrics").first();*/

               //get page title
               /*String title = doc.title();*/

               Elements elements = doc.select("td.headerRouteText"); 


               String maximo=elements.html(); 

                return maximo; 


            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {

            tvmaximo.setText(result);
            System.out.println(result);
            super.onPostExecute(result);
        }




    }


}

这是我要保存的 html:“MÍNIMO”、“MÁXIMO”、“VALOR MEDIO”和 89,99、47,341 和 17,3。不同变量中的每个值。共6个变量:

<tr>
   <td align="center">
      <table>
      <tr><td align="center" class="cabeceraRutaTexto" colspan="2">MÁXIMO </td>
      <td align="center" class="cabeceraRutaTexto" colspan="2">VALOR MEDIO </td>
      <td class="cabeceraRutaTexto" align="center">MÍNIMO </td>
 </tr>    
 <tr><td align="center" class="cabeceraRutaTexto">89,99 <img        
      SRC="../Diseno/imagenes/euro.gif" WIDTH="7" HEIGHT="8"> /MWh</td>
     <td>&nbsp;&nbsp;</td>
     <td align="center" class="cabeceraRutaTexto">47,341 <img 
           SRC="../Diseno/imagenes/euro.gif" WIDTH="7" HEIGHT="8"> /MWh</td>
     <td>&nbsp;&nbsp;</td>
     <td align="center" class="cabeceraRutaTexto">17,3 <img           
          SRC="../Diseno/imagenes/euro.gif" WIDTH="7" HEIGHT="8"> /MWh</td>
 </tr>
    </table>   
   </td>
 </tr>
</table> 

如您所见,很难创建正则表达式行,因为缺少对
的引用 build 它。我怎样才能用 Jsoup 做到这一点?预先感谢您的帮助和时间。

现在,感谢您的所有解释,我解决了您所看到的问题:

public class MainActivity extends Activity {

private TextView tvmaximo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tvmaximo=(TextView)findViewById(R.id.tvmaximo);

        new BackGroundTask().execute();

    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }



    class BackGroundTask extends AsyncTask<Void, Void, String> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        public String doInBackground(Void... params) {


            try {

               URL url= new URL("http://www.myweb.com");
               Document doc = Jsoup.connect(url.toString()).get();

                       /get elements table 1 (graphic table) */
                       Elements elementsgraphic = doc.select("div.divns6");
                       elementsgraphic.size(); //2

                       /* get elements table 2 (normal table) */
               Elements elements = doc.select("td.cabeceraRutaTexto");
               elements.size(); // 6

                  String barra1= elementsgraphic.get(0).text();       

               /* text values from table 2 */
                  String titulotxt = elements.get(0).text(); // TÍTULO
              String maximotxt = elements.get(1).text(); // TEXTO VALOR MAXIMO
              String mediotxt = elements.get(2).text(); // TEXTO VALOR MEDIO
              String minimotxt = elements.get(3).text(); // TEXTO VALOR MINIMO

           /* numeric values from table 2 */

                  String maximo = elements.get(4).text(); // NUMERICO VALOR MAXIMO
                  String medio = elements.get(5).text(); // NUMERICO VALOR MEDIO
                  String minimo = elements.get(6).text(); // NUMERICO VALOR MINIMO

                   return maximo;





            } catch (IOException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) {

            tvmaximo.setText(result);

            /*System.out.println(result);*/
            super.onPostExecute(result);
        }




    }


}
  1. 现在我还有两个问题,如何从下一段代码中的“activadiv”中获取“18”和“8”值?我正在尝试:

    元素 elementsgraphic = doc.select("div.divns6"); 元素 elementsgraphic = doc.select("div#divns6"); 元素 elementsgraphic = doc.select("changeImage('barra1");

等等...每次尝试时应用程序都会崩溃。我知道错误是在正则表达式上。

另一方面.. 我一直在尝试使用数组将所有这些变量返回到“OnPostExecute”,但程序出现边界错误,因为 Asynctask 不允许我返回数组。再次感谢您的耐心等待。

 <table>

   <tr><td><div name='divns6' id='divns6' style='position:relative;visibility:hidden;'       
        width='400' height='160'><table valign=botton cellpadding='0' cellspacing='0' 
        border='0'><tr     valign='bottom'>
    <td width=15 valign="bottom" height=150><a href="javascript:void(null)" 
             onMouseOver="changeImage('barra1','','47',2);activadiv('barra0','18');" 
             onMouseOut="changeImage('barra1','','47',0);desactivadiv('barra1');"><img 
             NAME="barra1" width="11px" height="47" border="0"></a></td>

    <td width=15 valign="bottom" height=150><a href="javascript:void(null)" 
             onMouseOver="changeImage('barra2','','21',2);activadiv('barra1','8');" 
             onMouseOut="changeImage('barra2','','21',0);desactivadiv('barra2');"><img 
             NAME="barra2" width="11px" height="21" border="0"></a></td>

      </td></tr></table>

最佳答案

选择它们并按位置提取,例如:

Elements elements = doc.select("td.cabeceraRutaTexto");
elements.size(); // 6
elements.get(0).text(); // MÁXIMO
elements.get(1).text(); // VALOR MEDIO
...
// or just the one you want
doc.select("td:eq(0).cabeceraRutaTexto").get(0).text() // MÁXIMO

根据评论更新:从给定的 html 中获取 18 作为 javascript 代码的一部分具有另一层复杂性,以下代码将提供所需的值,但请记住有解析和提取部分 javascript 的更好方法。

Document doc = Jsoup.parse(xml);
String onMouseOver = doc.select("a").attr("onMouseOver");
// while this will work, there are more robust ways to parse javascript
onMouseOver.split("'")[9];

关于android - JSoup如何选择和获取具体信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21842997/

相关文章:

android - 按下 HOME 键时杀死所有 Activity android

android - Google TV 插件在应用程序上使用直播电视

javascript - ScrollTop 仅在 IE Edge 中不起作用

java - 是否可以附加 2 个富文本字符串?

html - JavaFX WebView 不在 Sencha Touch 应用程序中显示蒙版图像

regex - 正则表达式快速更新代码

regex - 正则表达式单词边界,不包括连字符

java - FileNotFoundException 打开失败 : ENOENT (No such file or directory) while upload any type of file by Samsung devices

部分名称/内容文本需要 Java 文本解析帮助

java - GSON自定义解析