假设我有以下html:
<html>
<head>
</head>
<body>
<div id="wrapper" >
<div class="s2">I am going <a title="some title" href="">by flying</a>
<p>mr tt</p>
</div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
文本节点中任何等于或大于4个字符的单词,例如单词"going"将替换<span>going<span>为原始html中的html内容(不是文本)而不更改任何其他内容.
如果我尝试做像element.html(替换)这样的事情,问题是如果让当前元素<div class="s2">也将擦除<a title="some title"
使用Jsoup在符合此模式的两个块之间提取所有HTML(字符串,文档或元素)的最佳方法是什么:
<strong>
{any HTML could appear here, except for a <strong> pair}
</strong>
...
{This is the HTML I need to extract.
any HTML could appear here, except for a <strong> pair}
...
<strong>
{any HTML could appear here, except for a <strong> pair}
</strong>
Run Code Online (Sandbox Code Playgroud)
使用正则表达式可能很简单,如果我将它应用于整个body.html():
(<strong>.+</strong>)(.+)(<strong>.+</strong>)
^
+----- There I have my HTML content
Run Code Online (Sandbox Code Playgroud)
但是,当我从类似的挑战中学习时,如果我使用已经解析过Jsoup的DOM,性能可以得到改善(即使代码稍长) - 除了这次既不能Element.nextSibling()也不能解决问题Element.nextElementSibling().
例如,我在Jsoup中搜索了类似jQuery的nextUntil,但是找不到类似的东西.
是否有可能提出比上述基于正则表达式的方法更好的东西?
我有一个用户提交的字符串,其中包含HTML内容
"<p></p><div></div><p>Hello<br/>world</p><p></p>"
Run Code Online (Sandbox Code Playgroud)
我想转换这个字符串,以便删除空标记对(但<br/>保留空标记).例如,此转换的结果应将上面的字符串转换为
"<p>Hello<br/>world</p>"
Run Code Online (Sandbox Code Playgroud)
我想使用JSoup来做这件事,因为我已经在我的类路径中使用了这个,并且我最容易在服务器端执行此转换.
我试图在Java中解析CSS DOM,并且已经使用jSoup为HTML提供相同的功能.我正在浏览jSoup API(当然还有Google),但没有找到任何与CSS相关的解析类.有没有办法使用jSoup将CSS格式解析为DOM,还是需要不同的API?
我在Java中使用有效的HTML字符串(使用jsoup解析,因此所有标签都有结束标记并且形成良好),我需要查找给定标记名称的内容,例如,使用以下内容串:
<p> hi! </p>
<p> hi again! </p>
<h1> foo </h1>
<p> bye! </p>
Run Code Online (Sandbox Code Playgroud)
鉴于标签'p',我期望的结果是:
1)<p> hi! </p>
2)<p> hi again! </p>
3)<p> bye! </p>
Run Code Online (Sandbox Code Playgroud)
我通过简单地使用apache.commons.lang库和StringUtils.substringsBetween(String html,String"opentag",String"endtag")方法来完成这一点,该方法将返回一个具有所需结果的String数组.但是,当我搜索嵌套了完全相同标签的标签时(常见的例子是div)我会得到错误的结果(我理解为什么)
例如,使用...
<div>
<p> hey there </p>
<div>
<div>
<p> asd </p>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
我期待3个结果:1)
<div>
<p> hey there </p>
<div>
<div>
<p> asd </p>
</div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
2)
<div>
<div>
<p> asd </p>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
3)
<div>
<p> asd </p>
</div>
Run Code Online (Sandbox Code Playgroud)
但是我得到一个(我知道它是因为标签出现在String中的方式)我只是不知道如何解决它.我现在已经苦苦挣扎了两个星期了,我已经尝试过使用正则表达式而没有任何成功,我也尝试将html字符串拆分为一系列行,但也失败了.
你会如何解决这个问题?我已经知道有很多库使用jsoup的getAllElementsByTag(tagName)等方法为你做这件事,但我想自己做.任何提示都表示赞赏!
我有一个问题让这个工作.它包含一个由多条信息组成的字符串.但是,当我尝试将String写入文件以便跟踪程序随时间的变化时,我收到一个拒绝访问错误:
void writeToFile(String input) throws Exception{
File file = new File("C:\\WeatherExports\\export.txt");
if(!file.exists()){
file.createNewFile();
}
BufferedWriter inFile = new BufferedWriter(new FileWriter(file,true));
try{
inFile.append(input);
inFile.newLine();
} catch(Exception e){
e.printStackTrace();
}
inFile.close();
}
Run Code Online (Sandbox Code Playgroud)
STACKTRACE YEILDS:
java.io.FileNotFoundException: C:\WeatherExports\export.txt (Access is denied)
Run Code Online (Sandbox Code Playgroud)
完整Stacktrace:
java.io.FileNotFoundException: C:\WeatherExports\export.txt (Access is denied)
at java.io.FileOutputStream.openAppend(Native Method)
at java.io.FileOutputStream.<init>(Unknown Source)
at java.io.FileWriter.<init>(Unknown Source)
at org.weatheralert.InfoManipMethods.writeToFile(InfoManipMethods.java:58)
at org.weatheralert.Form.actionPerformed(Form.java:108)
at javax.swing.JTextField.fireActionPerformed(Unknown Source)
at javax.swing.JTextField.postActionEvent(Unknown Source)
at javax.swing.JTextField$NotifyAction.actionPerformed(Unknown Source)
at javax.swing.SwingUtilities.notifyAction(Unknown Source)
at javax.swing.JComponent.processKeyBinding(Unknown Source)
at javax.swing.JComponent.processKeyBindings(Unknown Source)
at javax.swing.JComponent.processKeyEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source) …Run Code Online (Sandbox Code Playgroud) java filenotfoundexception access-denied bufferedwriter jsoup
关于Jsoup的问题:我正在构建一个从网站上获取价格的工具.但是,该网站有流媒体内容.如果我手动浏览,我会看到20分钟之前的价格,并且必须等待大约3秒才能获得当前价格.有什么方法可以在Jsoup中做出某种延迟,以便能够在流媒体部分获得价格吗?我正在使用此代码:
conn = Jsoup.connect(link).userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.72 Safari/537.36");
conn.timeout(5000);
doc = conn.get();
Run Code Online (Sandbox Code Playgroud) 我试图从这个网站上抓取数据:http://www.bundesliga.de/de/liga/tabelle/
在源代码中,我可以看到表,但没有内容,只是这样的事情:
<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
<td>[no content]</td>
....
Run Code Online (Sandbox Code Playgroud)
使用firebug(Firefox中的F12)我也不会看到任何内容,但我可以选择表格,然后通过firebug选项复制innerHTML.在那种情况下,我得到了关于团队的所有信息,但我不知道如何获取Jsoup中的内容表.
我如何阅读和定位我需要在jsoup中输入登录信息的位置才能访问VPN上的网络?我对所涉及的步骤/主题的解释以及使用java的编程方法感兴趣(基本上如何使用jsoup在java中编写代码). 注意:对于所有重定向,我很难理解在jsoup-login中发生了什么以及如何/何时/在哪里编码.
到目前为止,这是我的工作流程:
我有一个目标页面,如下所示
[debug] status code 302 : https://centrale.landingnetwork.com/gp/stores/www.landingnetwork.com/gp/home/
Run Code Online (Sandbox Code Playgroud)
相应的标题:
{Server=Server, Date=Fri, 02 Mar 2018 04:36:49 GMT, Content-Type=text/html; charset=UTF-8, Transfer-Encoding=chunked, Connection=keep-alive, x-REQUESTNAME-id-1=ZZZAAA3YYYBBB9CCC999, x-frame-options=SAMEORIGIN, x-REQUESTNAME-id-2=123aaaWww1111iiiiix7777yyyzzzqqqhhhiiiE/wPUx/IaHiw6hfs7Y7/Gwa1X0, Location=https://centrale.landingnetwork.com/gp/stores/www.landingnetwork.com/gp/signin/gi-signin.html/123-1234567-1234567?ie=UTF8&landat=%2Fgp%2Fstores%2Fwww.landingnetwork.com%2Fgp%2Fhome%2F123-1234567-1234567&ort=1122334455.98765&rrt=1112223334.12121, Vary=Accept-Encoding,User-Agent, Content-Encoding=gzip, Set-cookie=session-id-scsus=123-1234567-1234567; path=/; domain=.landingnetwork.com; expires=Tue, 01-Jan-2036 00:00:01 GMT}
Run Code Online (Sandbox Code Playgroud)
当我在java/jsoup中导航到这个URL时,我得到了各种重定向.这是我的重定向的踪迹:(接下来的顺序)
[debug] status code 302 : https://centrale.landingnetwork.com/gp/stores/www.landingnetwork.com/gp/signin/gi-signin.html/123-1234567-1234567?ie=UTF8&landat=%2Fgp%2Fstores%2Fwww.landingnetwork.com%2Fgp%2Fhome%2F123-1234567-1234567&ort=1122334455.98765&rrt=1112223334.12121
Run Code Online (Sandbox Code Playgroud)
相应的标题:
{Server=Server, Date=Fri, 02 Mar 2018 04:36:49 GMT, Content-Type=text/html; charset=UTF-8, Transfer-Encoding=chunked, Connection=keep-alive, x-REQUESTNAME-id-1=ZZZAAA3YYYBBB9CCC999, x-frame-options=SAMEORIGIN, x-REQUESTNAME-id-2=123aaaWww1111iiiiix7777yyyzzzqqqhhhiiiEwwPwwwIaHiw6hfs7Y7vvva1X0, Location=https://wa.secureallnetwork.com/login?clienteId=Centrale-prod-wa&nonce=867:5309:867:5309:867:5309:867:5309:867:53099&redirect_uri=https%3A%2F%2Fcentrale.landingnetwork.com%3A443%2Fgp%2Fstores%2Fwww.landingnetwork.com%2Fgp%2Fsignin%2Fgi-landat.html%2F123-1234567-1234567%3Flandat%3D%2Fgp%2Fstores%2Fwww.landingnetwork.com%2Fgp%2Fhome%2F123-1234567-1234567&ort=1122334455.98765&rrt=1112223334.12121, Vary=Accept-Encoding,User-Agent, Content-Encoding=gzip, Set-cookie=session-id-scsus=123-1234567-1234567; path=/; domain=.landingnetwork.com; expires=Tue, 01-Jan-2036 00:00:01 GMT}
Run Code Online (Sandbox Code Playgroud)
以及链接路径中的下一个链接:
[debug] status code 200 : https://wa.secureallnetwork.com/login?clienteId=Centrale-prod-wa&nonce=867:5309:867:5309:867:5309:867:5309:867:53099&redirect_uri=https%3A%2F%2Fcentrale.landingnetwork.com%3A443%2Fgp%2Fstores%2Fwww.landingnetwork.com%2Fgp%2Fsignin%2Fgi-landat.html%2F123-1234567-1234567%3Flandat%3D%2Fgp%2Fstores%2Fwww.landingnetwork.com%2Fgp%2Fhome%2F123-1234567-1234567&ort=1122334455.98765&rrt=1112223334.12121
Run Code Online (Sandbox Code Playgroud)
相应的标题:
{Server=Server, Date=Fri, 02 Mar 2018 …Run Code Online (Sandbox Code Playgroud) jsoup ×10
java ×7
html ×3
html-parsing ×2
automation ×1
browser ×1
css ×1
parsing ×1
tags ×1
web ×1
web-scraping ×1