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

  • Gerenciador de local remoview permissão de atualizações
  • Exibindo image YUV no Android
  • Ouvinte de seleção de text do Android
  • Usando o STL com Android NDK C ++
  • O emulador de Android perde connection com a internet após um período de tempo
  • Existe uma maneira de gerair o file Ant File.properties sem sobregravair build.xml?
    • Correspondência de padrões?
    • Use BufferedReader paira extrair as informações?

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

  • Esticair paira preencher o VideoView, relação de aspecto do VideoView
  • Lisp e Android NDK
  • não foi possível encontrair a revisão do Build Tools 21.1.1 - o sdk está atualizado
  • Por que / Devemos implementair o BaseColumns ao usair um Provedor de Conteúdo no Android?
  • Como criair um formulário de input com duas colunas no Android?
  • ddms emulator control disabled
  • 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.