我们使用Jsoup来解析,操作和扩展html模板.到目前为止,一切正常,直到与HTML属性结合使用的单引号
<span data-attr='JSON'></span>
Run Code Online (Sandbox Code Playgroud)
该HTML代码段已转换为
<span data-attr="JSON"></span>
Run Code Online (Sandbox Code Playgroud)
这将与仅使用双引号指定为有效的内部json数据冲突
{"param" : "value"} //valid
{'param' : 'value'} //invalid
Run Code Online (Sandbox Code Playgroud)
所以我们需要强制Jsoup 不要将那些单引号改为双引号,但是如何?目前,这是我们解析和生成html内容的代码.
pageTemplate = Jsoup.parse(new File(mainTemplateFilePath), "UTF-8");
pageTemplate.outputSettings().escapeMode(Entities.EscapeMode.xhtml);
pageTemplate.outputSettings().charset("UTF-8");
... adding some html
pageTemplate.html(); // will output the double quoted attributes :(
Run Code Online (Sandbox Code Playgroud) 我收到这个错误:
03-04 09:55:55.915: W/dalvikvm(20171): Exception Ljava/lang/NullPointerException; thrown while initializing La/a/b/k;
03-04 09:55:55.915: W/dalvikvm(20171): Exception Ljava/lang/ExceptionInInitializerError; thrown while initializing La/a/b/l;
03-04 09:55:55.925: W/dalvikvm(20171): threadid=13: thread exiting with uncaught exception (group=0x40ab3300)
03-04 09:55:55.945: E/AndroidRuntime(20171): FATAL EXCEPTION: AsyncTask #1
03-04 09:55:55.945: E/AndroidRuntime(20171): java.lang.RuntimeException: An error occured while executing doInBackground()
03-04 09:55:55.945: E/AndroidRuntime(20171): at android.os.AsyncTask$3.done(AsyncTask.java:299)
03-04 09:55:55.945: E/AndroidRuntime(20171): at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
03-04 09:55:55.945: E/AndroidRuntime(20171): at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
03-04 09:55:55.945: E/AndroidRuntime(20171): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
03-04 09:55:55.945: E/AndroidRuntime(20171): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
03-04 09:55:55.945: E/AndroidRuntime(20171): at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
03-04 09:55:55.945: E/AndroidRuntime(20171): at …Run Code Online (Sandbox Code Playgroud) 我Jsoup.parse()用来解析这些数据.一切都很好,但需要很长时间.
例如,此数据需要20秒.用于解析.是否有其他解决方案满足我的需求?
码:
rezult = Jsoup.parse(res.parse().outerHtml(), "UTF-8").text();
Run Code Online (Sandbox Code Playgroud)
当res它从文字链接.
===========更新=============
我将这个变量分开Jsoup.parse()并理解它是问题的根源.它需要20秒,而不是Jsoup.parse().
String tmp = res.parse().outerHtml();
Run Code Online (Sandbox Code Playgroud)
这只需要1秒:
rezult = Jsoup.parse(tmp, "UTF-8").text();
Run Code Online (Sandbox Code Playgroud)
我使用此代码从此链接获取数据.我使用Jsoup.parse()因为没有它我得到这样的东西:
<html>
<head></head>
<body>
{"success":true,"currentUser":43743,"careTypes":[{"id":1,"name":"\u0421\u0442\u0438\u0440\u043a\u0430","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0438\u0440\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0436\u0438\u043c."},{"id":2,"name":"\u041e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435
Run Code Online (Sandbox Code Playgroud)
相反:
{"success":true,"currentUser":43743,"careTypes":[{"id":1,"name":"\u0421\u0442\u0438\u0440\u043a\u0430","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0442\u0438\u0440\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 \u0440\u0435\u0436\u0438\u043c."},{"id":2,"name":"\u041e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u0435","description":"\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043e\u0442\u0431\u0435\u043b\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0437\u0434\u0435\u0441\u044c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0432\u044b \u0432\u044b\u0431\u0435\u0440\u0435\u0442\u0435
Run Code Online (Sandbox Code Playgroud)
但现在主要的问题是将res.parse()方法更改为其他更少的执行时间.
===========更新2 =============
long t2 = …Run Code Online (Sandbox Code Playgroud) 我正在使用jsoup 1.7.3 Whitelist自定义配置.
显然它会清理<!-- ... -->文档中的所有HTML注释().
它还消毒<!DOCTYPE ...>元素.
Whitelist允许注释?!DOCTYPE元素定义为具有任何属性的allowed元素?我想在使用 JSoup 时保留 html 实体。这是来自网站的 utf-8 测试字符串:
String html = "<html><body>hello — world</body></html>";
String parsed = Jsoup.parse(html).toString();
Run Code Online (Sandbox Code Playgroud)
如果以 utf-8 格式打印解析后的输出,则序列 看起来会转换为代码点值为 151 的字符。
有没有办法让 JSoup 在输出为 utf-8 时保留原始实体?如果我以ascii编码输出:
Document.OutputSettings settings = new Document.OutputSettings();
settings.charset(Charset.forName("ascii"));
Jsoup.parse(html).outputSettings(settings).toString();
Run Code Online (Sandbox Code Playgroud)
我去拿:
hello — world
Run Code Online (Sandbox Code Playgroud)
这就是我正在寻找的。
在少数情况下,我传递具有用户执行某些操作的页面 url 的 JSON。该页面 url 将包含我需要的那些查询字符串部分,以便用户在我的应用程序需要时重定向到同一页面。我的 JSON 会像
{
"userId":"123456789",
"pageUrl":"http://exampl.com/designs.jsp?templateId=f348aaf2-45e4-4836-9be4-9a7e63105932&kind=123",
"action":"favourite"
}
Run Code Online (Sandbox Code Playgroud)
但是当我运行这个 json 时,Jsoup.clean(json, Whitelist.basic())我看到它&被替换为&. 我可以配置Jsoup为不单独转义此字符吗?
我正在尝试使用Jsoup从站点获取数据.链接到该网站是点击这里!
这是我获取数据的代码.`
// WARNING: do it only if security isn't important, otherwise you have
// to follow this advices: http://stackoverflow.com/a/7745706/1363265
// Create a trust manager that does not validate certificate chains
TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager(){
public X509Certificate[] getAcceptedIssuers(){return null;}
public void checkClientTrusted(X509Certificate[] certs, String authType){}
public void checkServerTrusted(X509Certificate[] certs, String authType){}
}};
// Install the all-trusting trust manager
try {
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(null, trustAllCerts, new SecureRandom());
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
;
}` …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Jsoup 解析网页并提取数据。但是链接是动态的,在显示详细信息之前会抛出一个等待加载的页面。所以 Jsoup 似乎处理的是等待页面而不是详细信息页面。有没有办法让这个等到页面完全加载?
我通过jsoup访问网页时获得404.但是通过浏览器访问时页面加载正常.
几天前我能通过jsoup访问该页面.但现在它抛出404.试图添加用户代理,超时等但没有运气.
在Firebug中,我收到404请求,但页面在浏览器中加载正常.
不确定页面如何在浏览器中呈现,而不是通过Java程序呈现.
Document doc = Jsoup.connect("http://example.com/stock.php?"+quote).userAgent("Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.110 Safari/537.36")
.timeout(1000*7).get();
Run Code Online (Sandbox Code Playgroud)
在执行Java程序时,获得以下错误:
org.jsoup.HttpStatusException:HTTP错误提取URL.状态= 404,URL = http://example.com/stock.php?AAA
at org.jsoup.helper.HttpConnection $ Response.execute(HttpConnection.java:537)
如果需要更多信息,请告诉我.
我试图使用JSoup获取此URL
http://betatruebaonline.com/img/parte/330/CIGUEÑAL.JPG
即使使用编码,我也有例外.我不明白为什么编码错了.它回来了
http://betatruebaonline.com/img/parte/330/CIGUEN%C3%91AL.JPG
而是正确的
http://betatruebaonline.com/img/parte/330/CIGUEN%CC%83AL.JPG
我怎么解决这个问题?谢谢.
private static void GetUrl()
{
try
{
String url = "http://betatruebaonline.com/img/parte/330/";
String encoded = URLEncoder.encode("CIGUEÑAL.JPG","UTF-8");
Response img = Jsoup
.connect(url + encoded)
.ignoreContentType(true)
.execute();
System.out.println(url);
System.out.println("PASSED");
}
catch(Exception e)
{
System.out.println("Error getting url");
System.out.println(e.getMessage());
}
}
Run Code Online (Sandbox Code Playgroud)