#java #android #html
#java #Android #HTML
Вопрос:
НОВЫЙ LOGCAT
06-21 13:24:25.850: W/ActivityThread(25137): Application it.rs.esempioparsinglistview is waiting for the debugger on port 8100...
06-21 13:24:40.704: W/System.err(25137): java.net.MalformedURLException: Protocol not found: /portals/v3_2/images/background-images.jpg
06-21 13:24:40.714: W/System.err(25137): at java.net.URL.<init>(URL.java:176)
06-21 13:24:40.714: W/System.err(25137): at java.net.URL.<init>(URL.java:125)
06-21 13:24:40.724: W/System.err(25137): at it.rs.esempioparsinglistview.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:119)
06-21 13:24:40.724: W/System.err(25137): at it.rs.esempioparsinglistview.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:1)
06-21 13:24:40.724: W/System.err(25137): at android.os.AsyncTask$2.call(AsyncTask.java:288)
06-21 13:24:40.724: W/System.err(25137): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-21 13:24:40.734: W/System.err(25137): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-21 13:24:40.744: W/System.err(25137): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-21 13:24:40.744: W/System.err(25137): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-21 13:24:40.744: W/System.err(25137): at java.lang.Thread.run(Thread.java:841)
06-21 13:29:03.541: W/ActivityThread(25327): Application it.rs.esempioparsinglistview is waiting for the debugger on port 8100...
06-21 13:29:16.984: W/System.err(25327): java.net.MalformedURLException: Protocol not found: /portals/v3_2/images/background-images.jpg
06-21 13:29:17.004: W/System.err(25327): at java.net.URL.<init>(URL.java:176)
06-21 13:29:17.004: W/System.err(25327): at java.net.URL.<init>(URL.java:125)
06-21 13:29:17.014: W/System.err(25327): at it.rs.esempioparsinglistview.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:118)
06-21 13:29:17.014: W/System.err(25327): at it.rs.esempioparsinglistview.MainActivity$ParsingPaginaWeb.doInBackground(MainActivity.java:1)
06-21 13:29:17.014: W/System.err(25327): at android.os.AsyncTask$2.call(AsyncTask.java:288)
06-21 13:29:17.014: W/System.err(25327): at java.util.concurrent.FutureTask.run(FutureTask.java:237)
06-21 13:29:17.024: W/System.err(25327): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
06-21 13:29:17.024: W/System.err(25327): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
06-21 13:29:17.034: W/System.err(25327): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
06-21 13:29:17.034: W/System.err(25327): at java.lang.Thread.run(Thread.java:841)
HTML-код
<figure class="f-art-list">
<a href="/news/Cronaca/295507/news.aspx" id="MainContent_ListNews_rptNews_lnkToNews1_0" title="Ai domiciliari dopo atti incendiari nei confronti di imprenditore di Noci. Arrestati due santermani">
<img style="display: block;" data-original="http://cdn.livenetwork.it/news/295507/634903800413300428_arresto_carabinieri_HomeStandard_191x95.jpg" src="http://cdn.livenetwork.it/news/295507/634903800413300428_arresto_carabinieri_HomeStandard_191x95.jpg" class="lazy img-responsive" alt="Ai domiciliari dopo atti incendiari nei confronti di imprenditore di Noci. Arrestati due santermani" title="Ai domiciliari dopo atti incendiari nei confronti di imprenditore di Noci. Arrestati due santermani">
</a>
</figure>
Привет, у меня проблема с синтаксическим анализом HTML JSoup, проблема с доказательствами LogCat в этой части:
cache.immagineart.setImageBitmap(immaginiart.get(pos));
Сообщения об ошибках LogCat
06-20 12:30:17.097: E/AndroidRuntime(15941): FATAL EXCEPTION: main
06-20 12:30:17.097: E/AndroidRuntime(15941): Process: it.rs.esempioparsinglistview, PID: 15941
06-20 12:30:17.097: E/AndroidRuntime(15941): java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
06-20 12:30:17.097: E/AndroidRuntime(15941): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
06-20 12:30:17.097: E/AndroidRuntime(15941): at java.util.ArrayList.get(ArrayList.java:308)
06-20 12:30:17.097: E/AndroidRuntime(15941): at it.rs.esempioparsinglistview.ParsingArrayAdapter.getView(ParsingArrayAdapter.java:78)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.AbsListView.obtainView(AbsListView.java:2295)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.ListView.measureHeightOfChildren(ListView.java:1263)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.ListView.onMeasure(ListView.java:1175)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.View.measure(View.java:16521)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1231)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.LinearLayout.onMeasure(LinearLayout.java:590)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.View.measure(View.java:16521)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.View.measure(View.java:16521)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
06-20 12:30:17.097: E/AndroidRuntime(15941): at com.android.internal.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:327)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.View.measure(View.java:16521)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5125)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
06-20 12:30:17.097: E/AndroidRuntime(15941): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2553)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.View.measure(View.java:16521)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1916)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1113)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1295)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5670)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:761)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.Choreographer.doCallbacks(Choreographer.java:574)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.Choreographer.doFrame(Choreographer.java:544)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:747)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.os.Handler.handleCallback(Handler.java:733)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.os.Handler.dispatchMessage(Handler.java:95)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.os.Looper.loop(Looper.java:136)
06-20 12:30:17.097: E/AndroidRuntime(15941): at android.app.ActivityThread.main(ActivityThread.java:5142)
06-20 12:30:17.097: E/AndroidRuntime(15941): at java.lang.reflect.Method.invokeNative(Native Method)
06-20 12:30:17.097: E/AndroidRuntime(15941): at java.lang.reflect.Method.invoke(Method.java:515)
06-20 12:30:17.097: E/AndroidRuntime(15941): at dalvik.system.NativeStart.main(Native Method)
ParsingArrayAdapter.java:78 is this: cache.immagineart.setImageBitmap(immaginiart.get(pos));
Эта часть предназначена для вставки Bitmap
в ArrayList
для img
Синтаксический анализ URL-адреса: http://www.santeramolive.it/news/tutte-le-news.aspx
Mainactivity.java
public class MainActivity extends Activity {
ListView lista;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lista = (ListView)this.findViewById(R.id.main_lista);//list id
//asynctask
ParsingPaginaWeb parsing = new ParsingPaginaWeb();
parsing.execute("");
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private class ParsingPaginaWeb extends AsyncTask<String,String,String> {
ArrayList<String> titoli; //list title
ArrayList<String> descrizioni; //list description
ArrayList<String> date; // list date
ArrayList<String> categorie; // list category
ArrayList<Bitmap> immaginiart; // lista img
@Override
protected void onPreExecute()
{
titoli = new ArrayList<String>();
descrizioni = new ArrayList<String>();
date= new ArrayList<String>();
categorie= new ArrayList<String>();
immaginiart = new ArrayList<Bitmap>();
}
@Override
protected String doInBackground(String... params) {
Bitmap bitmap;
try {
Document doc = Jsoup.connect("http://www.santeramolive.it/news/tutte-le-news.aspx")
.userAgent("Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.22 (KHTML, like Gecko) Chrome/25.0.1364.172 Safari/537.22")
.timeout(30000).get();
Element listarticoli = doc.getElementsByClass("list-articles").first();
Elements articoli = listarticoli.getElementsByClass("art-list");
for(Element articolo : articoli)
{
// title
String titolo = articolo.getElementsByClass("t-art-list").first().text();
// description
String descrizione = articolo.getElementsByTag("p").first().text();
// insert in arraylist
titoli.add(titolo);
descrizioni.add(descrizione);
Elements dcs = articolo.getElementsByClass("date-tag-art-list");
for(Element dc : dcs)
{
String data = dc.getElementsByClass("date-art-list").first().text();
String categoria = dc.getElementsByClass("tag-art-list").first().text();
date.add(data); // add date
categorie.add(categoria);// add category
}
//img part
Elements imgdivs = articolo.getElementsByClass("f-art-list");
for(Element imgsdiv : imgdivs)
{
Element divimg = imgsdiv.getElementsByClass("lazy img-responsive").first();
String imgSrc = divimg.attr("src");
InputStream input = new java.net.URL(imgSrc).openStream();
bitmap = BitmapFactory.decodeStream(input);
immaginiart.add(bitmap);
}
}
} catch (Exception e) {
Log.e("ESEMPIO", "ERRORE NEL PARSING");
}
return null;
}
@Override
protected void onPostExecute(String result)
{
ParsingArrayAdapter adapter = new ParsingArrayAdapter(MainActivity.this, titoli, descrizioni, date, categorie, immaginiart);
lista.setAdapter(adapter);
}
}
}
ParsingArrayAdapter.java
public class ParsingArrayAdapter extends ArrayAdapter<String>{
//riferimenti statici alle risorse e agli id
private final static int LAYOUT = R.layout.riga_listview;
private final static int TITOLO = R.id.riga_listview_titolo;
private final static int DESCRIZIONE = R.id.riga_listview_descrizione;
private final static int DATA = R.id.riga_listview_data;
private final static int CATEGORIA = R.id.riga_listview_categoria;
private final static int IMMAGINE= R.id.riga_listview_immagine;
ArrayList<String> titoli;
ArrayList<String> descrizioni;
ArrayList<String> date;
ArrayList<String> categorie;
ArrayList<Bitmap> immaginiart;
Context c; //context
LayoutInflater inflater; //layout inflater
public ParsingArrayAdapter(Context context,ArrayList<String> titoli,ArrayList<String> descrizioni, ArrayList<String> date, ArrayList<String> categorie, ArrayList<Bitmap> immaginiart)
{
super(context,TITOLO);
this.c = context;
this.titoli = titoli;
this.descrizioni = descrizioni;
this.date= date;
this.categorie= categorie;
this.immaginiart= immaginiart;
this.inflater = LayoutInflater.from(c);
}
@Override
public int getCount()
{
return titoli.size();
}
@Override
public View getView(int pos,View view,ViewGroup parent)
{
CacheRiga cache; //cache
if(view==null)
{
// creo la view ma non l'attacco alla lista in quanto devo ancora modificare
// i testi delle textview
view = inflater.inflate(LAYOUT, parent,false);
cache = new CacheRiga();
cache.titolo = (TextView) view.findViewById(TITOLO);
cache.descrizione = (TextView) view.findViewById(DESCRIZIONE);//collego descrizione
cache.data = (TextView) view.findViewById(DATA);
cache.categoria = (TextView) view.findViewById(CATEGORIA);
cache.immagineart = (ImageView) view.findViewById(IMMAGINE);
view.setTag(cache);
}
else
{
cache = (CacheRiga) view.getTag(); dalla view
}
cache.titolo.setText(titoli.get(pos));
cache.descrizione.setText(descrizioni.get(pos));
cache.data.setText(date.get(pos));
cache.categoria.setText(categorie.get(pos));
cache.immagineart.setImageBitmap(immaginiart.get(pos));
return view;
}
private class CacheRiga {
public TextView titolo;
public TextView descrizione;
public TextView data;
public TextView categoria;
public ImageView immagineart;
}
}
Комментарии:
1. В чем проблема? Пожалуйста, опубликуйте logcat.
2. и эта часть исправлена? для изображений parsimg? Элемент divimg = imgsdiv.getElementsByClass(«ленивый img-отзывчивый»).first(); Строка imgSrc = divimg.attr(«src»); Входной поток ввода = новый java.net.URL(imgSrc).openStream(); bitmap = BitmapFactory.decodeStream(ввод);
3. Пожалуйста, разместите больше строк logcat и разместите их в одном блоке. (теперь это беспорядок, как вы сами можете видеть). Странно, что
cache.immagineart.setImageBitmap(immaginiart.get(pos));
это вызывает ошибку синтаксического анализа, поскольку в этот момент ничего не анализируется. Из ArrayList извлекается только растровое изображение. Пожалуйста, сделайте два утверждения,BitMap bitmap=immaginiart.get(pos); cache.immagineart.setImageBitmap(bitmap);
а затем посмотрите, какое утверждение вызывает ошибку. Искаженное растровое изображение? Сохраните такое растровое изображение в файл и просмотрите с помощью внешнего приложения. Не знаю, правильно ли ваше декодирование. Пожалуйста, разместите код в обычном блоке. Не здесь.4.
ERRORE NEL PARSING
это ваш собственный оператор журнала. Пожалуйста, говорите такие вещи! Итак, у вас есть исключение, и оно вполне может быть в decodeStream. Вы не печатаете сообщение об исключении, поэтому вы выбрасываете ценную информацию. Измените инструкцию на ` Log.e(«ESEMPIO», «ОШИБКА ПРИ СИНТАКСИЧЕСКОМ АНАЛИЗЕ: » e.GetMessage());`; добавьте туда также e.printStackTrace().5. Сколько элементов вы можете включить в свои списки? Является ли исключение уже для первого элемента
for(Element articolo : articoli)
?
Ответ №1:
Ваша проблема в
String imgSrc = divimg.attr("src");
потому что divimg== null . Трассировка стека ясно показывает это. Далее происходит сбой приложения. Почему ты не сказал? Почему вы не опубликовали больше logcat / stacktrace? Вам бы помогли раньше.
Измените свой код на:
Element divimg = imgsdiv.getElementsByClass("lazy img-responsive").first();
if ( divimg==null)
{
Log.e(TAG, "divimg==null: " titolo);
immaginiart.add(null);
}
else
{
String imgSrc = divimg.attr("src");
InputStream input = new java.net.URL(imgSrc).openStream();
bitmap = BitmapFactory.decodeStream(input);
immaginiart.add(bitmap);
}
Это не приведет к декодированию изображения, а просто отобразит пустое изображение.
Комментарии:
1. у меня есть код изменения, но что я могу сделать для отображения статьи с изображением?
2. Покажите фрагмент исходного кода html, который вы хотите проанализировать. Красиво отформатирован. Не в комментарии.
3. Пожалуйста, скопируйте и вставьте как текст здесь.
4. Но не отформатирован. Первым шагом было бы получить тег img
.getElementByTag("img");
, пожалуйста, попробуйте.