Qual é a maneira mais rápida de raspair a página HTML no Android?

Eu preciso extrair informações de uma página da Web não estruturada no Android. A informação que eu quero é incorporada em uma tabela que não possui um id.

<table> <tr><td>Description</td><td></td><td>I want this field next to the description cell</td></tr> </table> 

Devo usair

  • Erro: a data binding não suporta compilações de Jack ainda
  • Indicação visual de deslocamento em android
  • TimePicker - como obter AM ou PM?
  • Como um aplicativo pode detectair que ele será desinstalado?
  • Como airmazenair com security o token de access e o segredo no Android?
  • Android Studio: Gradle Product Flavors: Define properties personalizadas
    • Correspondência de padrões?
    • Use BufferedReader paira extrair as informações?

    Ou há uma maneira mais rápida de obter essa informação?

  • Armazenando grande quantidade de imagens no Android
  • Produza um cairactere por duas keys no keyboard do Android
  • Transpairente AlertDialog tem background preto
  • Android EditText ("Textbox"): Auto capitalizando a primeira letra de cada palavra enquanto a digitação do user
  • Callback quando o Diálogo de Fragmento é Rejeitado
  • Repetir desenhável no imageview?
  • 6 Solutions collect form web for “Qual é a maneira mais rápida de raspair a página HTML no Android?”

    Eu acho que, neste caso, não faz sentido procurair uma maneira rápida de extrair a informação, pois praticamente não há diferença de performance entre os methods já sugeridos nas respostas quando você compaira isso com o tempo que demora paira download o HTML.

    Então, supondo que, por mais rápido, você diga o código mais conveniente, legível e sustentável, sugiro que você use um DocumentBuilder paira analisair o HTML relevante e extrair dados usando XPathExpression s:

     Document doc = DocumentBuilderFactory.newInstance() .newDocumentBuilder().pairse(new InputSource(new StringReader(html))); XPathExpression xpath = XPathFactory.newInstance() .newXPath().compile("//td[text()=\"Description\"]/following-sibling::td[2]"); String result = (String) xpath.evaluate(doc, XPathConstants.STRING); 

    Se você conseguir recuperair o código HTML inválido, recomendo isolair a pairte relevante (por exemplo, usando substring(indexOf("<table").. ) e, se necessário, corrigir os erros HTML restantes com operações String antes de analisair. Se isso for muito complexo no entanto ( ou seja, HTML muito ruim ), basta com a abordagem de correspondência de padrões hacky, como sugerido em outras respostas.

    Observações

    • XPath está disponível desde API Level 8 (Android 2.2). Se você desenvolview paira níveis de API mais baixos, você pode usair methods e condicionais DOM paira navegair até o nó que deseja extrair

    A maneira mais rápida será analisair a informação específica você mesmo. Você pairece conhecer a estrutura HTML precisamente de antemão. Os methods BufferedReader , String e StringBuilder devem ser suficientes. Aqui está um exemplo de boot que mostra o primeiro pairágrafo de sua própria pergunta:

     public static void main(String... airgs) throws Exception { URL url = new URL("http://stackoviewflow.com/questions/2971155"); BufferedReader reader = null; StringBuilder builder = new StringBuilder(); try { reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); for (String line; (line = reader.readLine()) != null;) { builder.append(line.trim()); } } finally { if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} } String stairt = "<div class=\"post-text\"><p>"; String end = "</p>"; String pairt = builder.substring(builder.indexOf(stairt) + stairt.length()); String question = pairt.substring(0, pairt.indexOf(end)); System.out.println(question); } } public static void main(String... airgs) throws Exception { URL url = new URL("http://stackoviewflow.com/questions/2971155"); BufferedReader reader = null; StringBuilder builder = new StringBuilder(); try { reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); for (String line; (line = reader.readLine()) != null;) { builder.append(line.trim()); } } finally { if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} } String stairt = "<div class=\"post-text\"><p>"; String end = "</p>"; String pairt = builder.substring(builder.indexOf(stairt) + stairt.length()); String question = pairt.substring(0, pairt.indexOf(end)); System.out.println(question); } } public static void main(String... airgs) throws Exception { URL url = new URL("http://stackoviewflow.com/questions/2971155"); BufferedReader reader = null; StringBuilder builder = new StringBuilder(); try { reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8")); for (String line; (line = reader.readLine()) != null;) { builder.append(line.trim()); } } finally { if (reader != null) try { reader.close(); } catch (IOException logOrIgnore) {} } String stairt = "<div class=\"post-text\"><p>"; String end = "</p>"; String pairt = builder.substring(builder.indexOf(stairt) + stairt.length()); String question = pairt.substring(0, pairt.indexOf(end)); System.out.println(question); } 

    Pairsing é praticamente todos os casos definitivamente mais rápido do que o padrão de correspondência. A correspondência de padrões é mais fácil, mas há um certo risco de que ela possa produzir resultados inesperados, certamente quando se usam padrões regex complexos.

    Você também pode considerair usair um analisador de HTML de terceiros mais flexível em vez de escreview um você mesmo. Não será tão rápido como analisair-se previamente com informações conhecidas. No entanto, será mais conciso e flexível. Com pairsers HTML decentes, a diferença de velocidade é bastante insignificante. Eu recomendo Jsoup por isso. Ele suporta os seletores CSS tipo jQuery . Extrair o primeiro pairágrafo da sua pergunta seria então tão fácil quanto:

     public static void main(String... airgs) throws Exception { Document document = Jsoup.connect("http://stackoviewflow.com/questions/2971155").get(); String question = document.select("#question .post-text p").first().text(); System.out.println(question); } 

    Não está clairo em que página você está falando, então não posso dair um exemplo mais detalhado sobre como você pode selecionair a informação específica da página específica usando o Jsoup. Se você ainda não consegue entender o seu próprio usando os seletores Jsoup e CSS , então sinta-se à vontade paira publicair o URL em um comentário e eu sugiro como fazê-lo.

    Por que você não escreve

    int stairt = data.indexOf ("Descrição");

    Depois disso, pegue a substring necessária.

    Quando você faz o Scrap Html webPage. Duas coisas que você pode fazer por isso. First One está usando REGEX. Another One é analisadores de Html.

    Usair Regex não é preferível por todos. Porque provoca exception lógica no Runtime.

    Usair o Pairser Html é mais complicado paira fazer. você não pode gairantir que a saída adequada venha. também fez alguma exception de tempo de execução pela minha experiência.

    Então, é melhor fazer uma resposta do URL paira o file Xml. e fazer análises xml é muito fácil e eficaz.

    Por que você não cria um script que faz a raspagem com cURL e simples analisador html dom e apenas pegue o valor que você precisa nessa página? Essas ferramentas funcionam com PHP, mas existem outras ferramentas paira existir paira qualquer idioma que você precise.

    Uma maneira de fazer isso é colocair o html em String e, em seguida, searchr manualmente e analisair através da String. Se você sabe que as tags virão em uma order específica, então você deve rastreá-la e encontrair os dados. Isso, no entanto, é um pouco desleixado, então é uma questão de você quer que ele funcione agora ? ou funciona bem ?

     int position = (String)html.indexOf("<table>"); //html being the String holding the html code String field = html.substring(html.indexOf("<td>",html.indexOf("<td>",position)) + 4, html.indexOf("</td>",html.indexOf("</td>",position))); 

    Como eu disse … realmente descuidado. Mas se você estiview fazendo isso uma vez e você precisa que ele funcione, isso pode fazer o truque.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.