在下面的场景中,我们有String
来自任何页面的原始HTML
(它可以更大),我们必须找到一些值({{1} }没有任何HTML
或Id
)
在带有html代码的大clases
中,我们必须提取一些值并将它们保存在变量上,在此示例中为总信用值(60)。
String
提取该值的最佳方法是什么?。
我所做的是识别一个唯一的String response = "...
<BR>
<FONT COLOR="NAVY" FACE="ARIAL" SIZE="2">
<B>TOTAL CREDITS:</B>&NBSP; 60
</FONT>
<BR>
..."
,我在那时剪切了字符串,然后我剪切了prefix
。
sufix
有更好的方法吗?
答案 0 :(得分:2)
有一些特定的API用于解析java中的HTML文件。
此链接可以是一个很好的起点https://www.mkyong.com/java/jsoup-html-parser-hello-world-examples/
如果您正在使用maven,则必须包含依赖项
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.10.2</version>
</dependency>
然后,您可以使用此代码作为起点,如您所见,使用jsoup将文档DOM加载为文档,然后您可以使用与解析xml文件类似的方法搜索dom元素:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.IOException;
Document doc;
try {
// need http protocol
doc = Jsoup.connect("http://google.com").get();
// get page title
String title = doc.title();
System.out.println("title : " + title);
// get all links
Elements links = doc.select("a[href]");
for (Element link : links) {
// get the value from href attribute
System.out.println("\nlink : " + link.attr("href"));
System.out.println("text : " + link.text());
}
} catch (IOException e) {
e.printStackTrace();
}
希望这有帮助
答案 1 :(得分:1)
重申评论中的内容:不使用正则表达式解析HTML 。
但是,要回答您是否有更好的方法来处理某些常规字符串的直接问题:是的,只需使用func generateQRCode(from string: String) -> UIImage? {
let data = string.data(using: String.Encoding.ascii)
if let filter = CIFilter(name: "CIQRCodeGenerator") {
filter.setValue(data, forKey: "inputMessage")
let transform = CGAffineTransform(scaleX: 3, y: 3)
if let output = filter.outputImage?.transformed(by: transform) {
return UIImage(ciImage: output)
}
}
return nil
}
。
您现在正在做的一个问题是您创建了许多额外的字符串和数组,您会立即丢弃它们。所以,你也可以不创造它们。另一个问题是String.indexOf
将正则表达式作为参数,因此您需要注意前缀和后缀不包含特殊字符(除非您实际上想要那些特殊字符);你可以简单地引用它们,使用String.split
来避免这个问题。
此:
Pattern.quote
将字符串的一部分放在前缀之后,并在后缀之前。
你可以找到这样的前缀:
String value = response.split("TOTAL CREDITS:</B>&NBSP;")[1].split("</FONT>")[0].trim();
(您需要考虑int endOfPrefix = response.indexOf(prefix) + prefix.length();
不在字符串中的情况)
和后缀的开头如下:
prefix
(您需要考虑字符串中int startOfSuffix = response.indexOf(suffix, endOfPrefix);
不存在的情况)。 suffix
参数可能没有必要;这只是确保在前缀出现之前没有找到后缀的出现。
然后只需要它们之间的子串:
endOfPrefix