JSoup 网络抓取:如何 select 每个值
JSoup web-scraping: How to select each value
我目前正在尝试使用 Jsoup 从 website 为我的 android 应用程序获取一些值。
基本上,我想提取这些值:
因此在代码中,模型名称应该转到 gpuModel 变量,价格转到 gpuPrice 等等。然后我会使用以下代码将它们存储在 firebase 中:
public void addToDatabase(String model, int price, int rating, double value,
double bench) {
Map<String, Object> docData = new HashMap<>();
docData.put("model", model);
docData.put("rating", rating);
docData.put("bench", bench);
docData.put("value", value);
docData.put("price", price);
db.collection("gpu").document(model).set(docData);
}
这是每个 GPU 的 HTML 代码:
我目前正在尝试仅提取 gpu 模型名称以保持简单(最后我也想提取所有其他值),这是我当前的网络抓取代码:
public void webScrape(){
new Thread(new Runnable() {
@Override
public void run() {
final StringBuilder builder = new StringBuilder();
try {
Document doc = Jsoup.connect("https://www.videocardbenchmark.net/GPU_mega_page.html").get();
Elements gpus = doc.select("[id^=gpu]");
for (Element i : gpus) {
Elements gpuModel = i.select("tr td:nth-child(2)");
String gpuName = gpuModel.text().replace("/", "");
addToDatabase(gpuName, 12,12,12,12);
}
} catch (IOException e){
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
}).start();
按照我的逻辑,这应该 select 所有 GPU,然后在 for 循环中,它只会提取卡的名称。将 gpuName 设置为提取的任何内容并将其推送到数据库。
但是,我在我的数据库中得到了这个:
它提取了 GPU 名称,还提取了所有其他不需要的字段(包括价格、价值、测试日期等)。
所以我的问题是,我如何 select 每个值分别?我在互联网上找到的所有示例都是在一个非常简单的网站上完成的,其中每个值都有自己的 ID,所以我无法真正从中学习。
如果有什么需要我提供的,请告诉我。
我想要的简单代码表示:
Document doc = Jsoup.connect(the url).get();
Elements gpus = doc.select(all gpu);
for (each gpu in all gpus) {
gpuName = gpu.select(name);
gpuPrice = gpu.select(price);
gpuValue = gpu.select(value);
gpuPower = gpu.select(power);
addToDatabase(gpuName, gpuPrice, gpuPower, gpuValue);
}
您应该在 run
方法中使用 a:nth-child(2)
作为模型名称选择器:
Elements gpuModel = i.select("a:nth-child(2)");
我目前正在尝试使用 Jsoup 从 website 为我的 android 应用程序获取一些值。
基本上,我想提取这些值:
public void addToDatabase(String model, int price, int rating, double value,
double bench) {
Map<String, Object> docData = new HashMap<>();
docData.put("model", model);
docData.put("rating", rating);
docData.put("bench", bench);
docData.put("value", value);
docData.put("price", price);
db.collection("gpu").document(model).set(docData);
}
这是每个 GPU 的 HTML 代码:
我目前正在尝试仅提取 gpu 模型名称以保持简单(最后我也想提取所有其他值),这是我当前的网络抓取代码:
public void webScrape(){
new Thread(new Runnable() {
@Override
public void run() {
final StringBuilder builder = new StringBuilder();
try {
Document doc = Jsoup.connect("https://www.videocardbenchmark.net/GPU_mega_page.html").get();
Elements gpus = doc.select("[id^=gpu]");
for (Element i : gpus) {
Elements gpuModel = i.select("tr td:nth-child(2)");
String gpuName = gpuModel.text().replace("/", "");
addToDatabase(gpuName, 12,12,12,12);
}
} catch (IOException e){
e.printStackTrace();
}
runOnUiThread(new Runnable() {
@Override
public void run() {
}
});
}
}).start();
按照我的逻辑,这应该 select 所有 GPU,然后在 for 循环中,它只会提取卡的名称。将 gpuName 设置为提取的任何内容并将其推送到数据库。
但是,我在我的数据库中得到了这个:
它提取了 GPU 名称,还提取了所有其他不需要的字段(包括价格、价值、测试日期等)。
所以我的问题是,我如何 select 每个值分别?我在互联网上找到的所有示例都是在一个非常简单的网站上完成的,其中每个值都有自己的 ID,所以我无法真正从中学习。
如果有什么需要我提供的,请告诉我。
我想要的简单代码表示:
Document doc = Jsoup.connect(the url).get();
Elements gpus = doc.select(all gpu);
for (each gpu in all gpus) {
gpuName = gpu.select(name);
gpuPrice = gpu.select(price);
gpuValue = gpu.select(value);
gpuPower = gpu.select(power);
addToDatabase(gpuName, gpuPrice, gpuPower, gpuValue);
}
您应该在 run
方法中使用 a:nth-child(2)
作为模型名称选择器:
Elements gpuModel = i.select("a:nth-child(2)");