如何使用Java(Android)从网站上抓取数据?

时间:2013-01-03 16:29:04

标签: java android web-scraping jsoup

我的Android应用会从电话号码获取运营商信息。我打算使用Jsoup(或其他Java HTML解析器)来刮取表格中显示的载体信息。

我试图从fonefinder.net

中抽身

查询网址格式为:

http://www.fonefinder.net/findome.php?npa=**first 3 digits**&nxx=**next 3 digits**&thoublock=**final 4 digits**

页面的HTML是一个简单的表格(见下文)。我正在尝试从第2行第5列中提取数据,其中链接以

格式显示
http://fonefinder.net/(CARRIER_NAME).php

其中CARRIER_NAME的值类似于“verizon”。我需要帮助找出如何提取这些数据。

<table border="3" cellspacing="2" cellpadding="2" bgcolor="#FFFFCC">
  <tbody>
    <tr bgcolor="#7093DB" align="CENTER">
      <th>
        Area Code
      </th>
      <th>Prefix</th>
      <th>
        City/Switch Name
        <br>
        (Click for city search)
      </th>
      <th>
        State/Prov.
        <br>
        Area Map
      </th>
      <th>
        Telephone Company
        <br/>
        Web link
      </th>
      <th>
        Telco
        <br/>
        Type
      </th>
      <th>
        Map/Zip
        <br/>
        Detail
      </th>
    </tr>
    <tr>
      <td>
        **first 3 digits**
      </td>
      <td>
        **next 3 digits**
      </td>
      <td>
        City Name
      </td>
      <td>
        State Name
      </td>
      <td>
        <a href="http://fonefinder.net/CARRIER_NAME.PHP">carrier name</a>
      </td>
      <td>WIRELESS PROV</td>
      <td>
        map
      </td>
    </tr>
  </tbody>
</table>

1 个答案:

答案 0 :(得分:0)

我编写的代码大量使用Jsoup的选择器语法来按名称解析标记,但您也可以通过CSS类,id,属性等进行解析。 Jsoup selector syntax documentation包含您可以使用的完整选择器列表。

import java.io.IOException;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

public class StackOverflowQuestion {

    public static void main(String[] args) {

        try {
            // get the tables on this page, note I masked the phone number
            Document doc = Jsoup.connect("http://www.fonefinder.net/findome.php?npa=###&nxx=###&thoublock=####").get();
            Elements tables = doc.select("table");

            // get the second table, 0 indexed
            Element secondTable = tables.get(1);

            // get the columns
            Elements tds = secondTable.select("td");

            //get the 5th column, 0 indexed
            Element fifthTd = tds.get(4);

            //get the link in this column
            Element link = fifthTd.select("a").first();

            //print out the URL
            System.out.println(link.attr("href"));

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