我正在开发一个应用程序,让立法在线,并自动解析和格式化它,以适应应用程序。我用的测试点是
http://www.planalto.gov.br/ccivil_03/constitutionao/constitutionicao.htm
我想抓取那个URL的所有内容,解析(也许清理)它们,并把它们放到一个文件中。我使用的是Jsoup,这是我用来连接和打印内容到文件的Runnable:
class FetchHtmlRunnable implements Runnable {
String url;
FetchHtmlRunnable(String url) {
this.url = url;
}
@Override
public void run() {
try {
Document doc = Jsoup.parse(new URL(url), 10000);
doc.charset(Charset.forName("windows-1252"));
Charset charset = doc.charset();
String htmlString = Jsoup.clean(doc.toString(), new Whitelist());
Log.d(TAG, "run: HTMLSTRING: " + htmlString);
String root = context.getFilesDir().toString();
file = new File(root + File.separator + "law.txt");
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream(file, false), charset);
out.write(htmlString);
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
然而,即使Chrome告诉我站点的编码是windows-1252,日志条目和文件中不仅填充了替换字符(它丢失了所有带音调符号的字符,如íandã),它还丢失了所有新行:
宪法和联邦宪法在1988年宪法修订第91号,2016年宪法修订第106号,2020年宪法修订第107号,2020年宪法修订第3号宪法修订第3号宪法修订第3号。5 ndice tem tico Texto compilado prembulo n s,代表do povo brasileiro,reunidos em assembll ia Nacional constitute para institiir um Estado democr tico,destinado a asegurar o exerc cio dos direitos sociais e indiviais,a liberdade,a seguran a,o bem-estar,o desenvolvimento,a igualdade e justi a como valores supremos de uma sociedade fraterna,pluralista e sem
也许有更擅长网络开发的人可以告诉我这是不是网页的问题,以及我如何解决这个问题。。。以及如何保留换行符。
我将在一秒钟内用葡萄牙语,西班牙语(和中文)写出这个关于字符集的答案的剩余部分。不过,首先,让我说,您试图读取的页面--实际上使用“ajax/js”
加载了页面的内容。我可以使用自己在Internet上提供的库下载Ajax
,但也需要其他工具,如Selenium
,Puppeteer
或Splash
。不提字符集,你是如何在第一时间下载你的“巴西宪法”的内容到HTML的?当我尝试一个直接的HTML下载器(没有脚本执行)时,我得到了一堆Java--完全没有任何葡萄牙语的脚本--看起来一点也不像你问题中发布的HTML。:)
如果您已经在下载HTML,只是字符集有问题,请阅读下面的答案。如果您无法下载除AJAX/JavaScript调用之外的任何内容--我可以在另一个答案中的一两行中发布另一个解释执行JS/AJAX的答案。(本质上,您发布的输出与我得到的不一样)。
在99.9999%的情况下,如果它不是直接的“ASCII”
(因为它有外语字符),那么它(几乎)可以保证使用“UTF-8”
字符集的版本是可读的。我翻译西班牙语新闻文章,也翻译中文新闻文章--而且UTF-8
总是对我有用。我有一个西班牙语站点需要一个名为“ISO8859-1”
的编码,但我发现它的“Don Quijote de La Mancha”站点除外-UTF8可以工作。
说实话,这根本不是一个问题,因为当阅读网页(而不是编写网页)时,Java会自动解析文本,就像它是UTF-8一样,没有任何配置。下面是我编写的一个库中的“Open Connection”方法体:
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod ("GET");
if (USE_USER_AGENT) con.setRequestProperty ("User-Agent", USER_AGENT);
return new BufferedReader (new InputStreamReader(con.getInputStream()));
下面是我的库中的一个“Scrape Contents”方法的方法体:
URL url = new URL("http://www.planalto.gov.br/ccivil_03/constituicao/constituicao.htm");
StringBuilder sb = new StringBuilder();
String s;
BufferedReader br = Scrape.openConn(url);
while ((s = br.readLine()) != null) sb.append(s + "\n");
FileRW.writeFile(sb.toString(), "page.html");
老实说,我对微软字符集一无所知。我用UNIX编写代码,从来没有担心过任何字符集--除了确保在编写HTML(而不是阅读HTML)时,将HTML元素插入到我的页面中。