gpt4 book ai didi

java - 从网页源读取随机失败 - Java

转载 作者:行者123 更新时间:2023-12-02 04:03:02 27 4
gpt4 key购买 nike

这是我在 Java 中见过的最奇怪的事情。情况是这样的。我尝试在没有任何 API 的情况下读取 80 多个 URL(这真的很糟糕)。这些网页有一种显示我需要的信息的通用方式,因此我通常可以通过一些正则表达式语句来找到感兴趣的项目。

这是我正在尝试阅读的示例网页。 Webpage

我有两个非常草率的类来完成此任务:

测试器.java。这里的 Main 方法只是从我的计算机上读取 URL,并为每个 URL 调用 Tools 类中的一个方法,该方法返回一个 ArrayList。然后它将 ArrayList 中的所有这些项目添加到更大的 ArrayList 中,这就是我想要的输出。我的程序从未达到这一点。

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;

public class Tester
{
public static int d2counter = 0;

public static void main(String[] args)
{
ArrayList<String> database = new ArrayList<>();
ArrayList<String> urls = new ArrayList<>();

try
{
FileReader writer = new FileReader("res/URLs.txt");
BufferedReader reader = new BufferedReader(writer);

while (reader.ready())
{
urls.add(reader.readLine());
}

for (String i : urls)
{
System.out.println(++d2counter + " " + i);
ArrayList<String> temp = Tools.readURL(i);

for (String h : temp)
{
database.add(h);
}
}

Tools.outputArraysToFile(database, "output.txt");

reader.close();
}
catch (FileNotFoundException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

工具.java。这是一个充满静态方法的辅助类。这里唯一感兴趣的方法是 readURL() 方法。

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collection;

/**
* Class which will house useful tools for other classes in this program.
*/
public abstract class Tools
{
public static ArrayList<String> readURL(String address)
{
ArrayList<String> temp = new ArrayList<>();

try
{
// Create a reader to read the webpage.
BufferedReader reader = new BufferedReader(new InputStreamReader(new URL(address).openStream()));

// Line variable to be used by Reader.
String line = "";

// Phase 1: Navigate to the desired section of the webpage.
int counter2 = 1;
while (reader.ready())
{
line = reader.readLine();
counter2++;

if (line.contains("MAIN CONTENT"))
{
break;
}
}

if (!reader.ready())
{
System.err.println("ERROR: Reached bottom of document without finding page title.");
System.exit(1);
}

String name, url, type;
type = "Default";

// Find the type.
for (int i = 0; i < 3; i++)
{
line = reader.readLine();

if (line.matches(".*<B>[A-Za-z\\s]+</b>.*"))
{
line = line.substring(line.indexOf("<B>") + 3, line.indexOf("</b>"));
line = line.replace("Normal", "");
line = line.replace("Exquisite", "");
line = line.replace("Elite", "");
line = line.trim();
if (line.endsWith("s"))
{
line = line.substring(0, line.length() - 1);
}

type = line;
break;
}
}

// Phase 2: Add data:
while (!line.contains("END MAIN CONTENT"))
{
line = reader.readLine();

if (line.contains(".gif"))
{
line = line.replaceFirst(".*src=\"", "");
url = "classic.battle.net" + line.substring(0, line.indexOf("\""));

for (int i = 0; i < 5; i++)
{
line = reader.readLine();

if (line.matches(".*<b>[-A-Za-z\\s]+</b>.*"))
{
line = line.replaceFirst(".*<b>", "");
line = line.replaceFirst("</b>.*", "");

name = line;
temp.add(name + "," + type + "," + url);

break;
}
}
}
}

reader.close();
}
catch (IOException e)
{
System.err.println("Unable to read from URL.");
e.printStackTrace();
}

return temp;
}
}

这是奇怪的部分:每次运行该程序时,它似乎都是随机失败的。

First run

Second run

Third run

更奇怪的是,如果您访问这些网页,您会发现它们的代码中都有“主要内容”,而我的 .contains("MAIN CONTENT") 行应该有检测到。我在帮助程序打印语句中添加了它以显示它卡在哪个 URL 上以及该行是否存在。每次我使用调试器时,它都会按照我的操作运行。不过,由于有数千行输入,我似乎无法有效地在整个过程中断点。我不明白——我一定缺少一些东西。

谢谢大家!

最佳答案

您错误地使用了 ready() 方法——事实上,您根本不应该使用它。当仍有数据需要读取时,它会导致您的程序停止读取。

readLine() 方法就是您所需要的。当您到达文本末尾时,它会返回 null,并且这就是您用来控制循环的内容。标准习惯用法是:

String line = null;
while ((line = reader.readLine()) != null) {
// process the line
}

ready()返回false时,并不意味着没有任何内容可供读取,而是意味着底层流目前尚未准备好读取,并且其缓冲区中没有字符。换句话说,BufferedReader 必须等待(可能是几毫秒)才能访问更多字符。在我看来,这是一种低级方法,甚至不应该具有 public 可见性。在您之前,很多人都掉进了这个陷阱。

关于java - 从网页源读取随机失败 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34689457/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com