爬虫心得(四)

本文分享了作者在爬虫项目中的实践经验,重点讨论了RequestDetail和ProcessArticle两个函数的功能,以及如何处理文章中的img和video标签。通过正则表达式匹配和替换,成功提取和设置了图片链接,并提醒在XPath选择器中避免使用数字定位文本,以降低风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这次采集正好赶上我的毕业,所以,晚了三天才看到邮箱里面的任务,这次处理很顺利。

但是,也是自以为很顺利,结果还是经历了一些困难。

现在就列一下所遇到的问题

目录

1.RequestDetail函数和ProcessArticle函数的作用

2.处理文章中出现的img和video标签

3.注意


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中,尽量不要使用数字进行文本定位,风险太高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值