这次采集正好赶上我的毕业,所以,晚了三天才看到邮箱里面的任务,这次处理很顺利。
但是,也是自以为很顺利,结果还是经历了一些困难。
现在就列一下所遇到的问题
目录
1.RequestDetail函数和ProcessArticle函数的作用
1.RequestDetail函数和ProcessArticle函数的作用
RequestDetail函数,是通过取article里的articleUrl然后发送请求,返回未处理的文本(原始文本)
ProcessArticle函数则是对RequestDetail函数返回的未处理的文本进行处理
{
text可能不规范,里面可能会有没有处理的html标签
publishtime可能不规范,需要精确到毫秒级
article.settext 也是在这里实现
}
2.处理文章中出现的img和video标签
此块功能放在ProcessArticle当中,处理文本。通过对文本进行正则匹配,然后替换,达到处理的目的。
从正文里重新提取img链接
public List<String> getElementListTextAgainstXPath(String strDoc, String strXPath) {
List<String> listRtn = new ArrayList<>();
try {
Document doc = DomParser.loadDOMDocument(strDoc, "utf-8");
NodeList nodeList = DomParser.selectNodeList(doc, strXPath);
for (int i = 0; i < nodeList.getLength(); i++) {
String strValue = nodeList.item(i).getTextContent().trim();
if (!TextUtils.isEmpty(strValue)) {
listRtn.add(strValue);
}
}
} catch (SAXException | IOException | TransformerException e) {
LOG.error("getElementListTextAgainstXPath occurs error", e);
}
return listRtn;
}
处理img标签
public String removeTagOtherAttr(String reg, String strDoc, String tagName) {
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(strDoc);
while (matcher.find()) {
String temp = matcher.group();
if (matcher.groupCount() >= 1) {
String src = matcher.group(1);
if ("video".equals(tagName)) {
strDoc = strDoc.replace(temp, new StringBuilder("<").append(tagName).append(" src=\"").append(src).append("\"><video>").toString());
} else {
strDoc = strDoc.replace(temp, new StringBuilder("<").append(tagName).append(" src=\"").append(src).append("\"/>").toString());
}
}
}
return strDoc;
}
img标签的正则表达式为:
String regImg = "<img.*?src=\\\"(.*?)\\\"[\\s\\S]*?/>";
video标签的正则表达式为:
String regVideo = "<video.*?src=\\\"(.*?)\\\"[\\s\\S]*?/>";
提取出的img的list,用article.setImageUrls(list)设置下
示例:
String ret;
String url = article.getArticleUrl();
ret = article.getText();
ret = HtmlUtils.getTagFormattedText(ret, url);
String regImg = "<img.*?src=\\\"(.*?)\\\"[\\s\\S]*?/>";
String tagName = "img";
ret = removeTagOtherAttr(regImg, ret, tagName);
String xpath = "//img/@src";
String regVideo = "<video.*?src=\\\"(.*?)\\\"[\\s\\S]*?/>";
String tagName1 = "video";
ret = removeTagOtherAttr(regVideo, ret, tagName1);
List<String> imgurls = new ArrayList<>();
imgurls = getElementListTextAgainstXPath(ret, xpath);
article.setImageUrls(imgurls);
article.setText(ret);
先提取替换,再设置article.setImageUrls
需要注意一点,
imgurls = getElementListTextAgainstXPath(ret, xpath);
这里的函数xpath需要匹配到图片的链接(即src)
3.注意
在xpath中,尽量不要使用数字进行文本定位,风险太高