从网页中通过正则表达式获取标题等信息(二)实现过程分析

上篇文章,介绍了我2012年实现的一个内容聚合网站,通过正则表达式抽取网页内容,并提供了代码实现。

从网页中通过正则表达式获取标题、URL和发表时间

本文将进一步介绍其实现过程:

(1)网页结构分析

在2012年左右,JavaScript还远没有今天这么强大,当时html是网页的骨架,css进行风格装饰,javascript提供动作。

[注]在当今动辄 React、Angular、Vue之类技术做前端,前端一栈式开发的背景下,内容抽取也许大不一样。

从网页页面上抽取内容,需要分析其html结构。一般情况下是通过table、ul、li、div之类的标签提供一个列表,内容页面一般是通过div实现的。

比如博客园的“精华区”,通过Chrome的F12,

然后“查看元素”,整个列表页面是通过div支撑起来的,每一条也是一个div;

其中标题和链接是在<div class="post_item">下的<a class="titlelnk"中;

发表时间,是在<a href=和<span class="article_comment">之间。

(2)内容提取

知道了结构,下一步就是如何提取内容了。

  • 提取整个列表部分

该部分相对比较简单,找到列表部分的起始、结束部分就可以了。

如博客园精华部分的起始是:<div id="post_list">,结束是:</div>。

一般情况下,开始位置比较容易确定,但结束位置这么些用正则表达式在结束标签是div的时候是无法获取内容的。这种情况下要找到结束标签的下一个标签,

比如:

<script>editorPickStat(); aggSite.user.getUserInfo();</script>
1  // 获得网址所在的匹配区域部分
2
3   private static String getContentArea(String urlContent, String strAreaBegin,String strAreaEnd) {
4
5 ?    int pos1 = 0, pos2 = 0;
6 ?    pos1 = urlContent.indexOf(strAreaBegin) + strAreaBegin.length();
7 ?    pos2 = urlContent.indexOf(strAreaEnd, pos1);
8 ?    return urlContent.substring(pos1, pos2);
9   }

然后通过正则表达式获取一个列表:

1 Pattern pt = Pattern.compile(rb.getRegex());
2 ?Matcher mt = pt.matcher(contentArea);
3
4 while (mt.find()) {
  • 提取单条记录

    方法同提取内容部分差不多,如单条记录的起始标签为<div class="post_item">,结束标签相对来说也比较难确定。

    获取单条记录,并去除空格之类的无用字符:

    1 String rowContent = mt.group();
    2
    3 rowContent = rowContent.replaceAll(rb.getRemoveRegex(), "");
  • 提取出标题

    取出标题用的是 >.?</a>或者title=.?>,并且要去除空格和多余的字符,需要用到类似:<li>|</li>|(<img)([\s\S]?)(>)|(<div)([\s\S]?)(>)|</div>或者(<table)([\s\S]?)(>)|<tr>|(<td)([\s\S]?)(>)|</td>|</tr>|(<table)([\s\S]*?)(>)之类的。

     1 // 获取标题
     2
     3 Matcher title = Pattern.compile(rb.getTitleRegex()).matcher(rowContent);
     6
     7 while (title.find()) {
     8
     9 String s = title.group().replaceAll("||>|</a>|\[.*?\]|</l>","");
    10
    11 if(s ==null || s.trim().length()<=0){
    13 s = "error";
    15 }
    17 tuBean.setTitle(s);
    18
    19 }
  • 提取出超链接

    提取出超链接,需要用到 href=.?target=或者href=.?.> 或者 href=.*?title。要根据实际情况配置。

     1 // 获取网址
     2
     3 Matcher myurl = Pattern.compile(rb.getUrlRegex()).matcher(
     4
     5 rowContent);
     6
     7 while (myurl.find()) {
     8
     9 String u = myurl.group().replaceAll(
    10
    11 "href=|"|>|target=|_blank|title", "");
    12
    13 u = u.replaceAll("‘|\\", "");
    14
    15 if(u!=null && (u.indexOf("http://")==-1)){
    16
    17 tuBean.setUrl(rb.getPrefix() + u);
    18
    19 }else{
    20
    21 tuBean.setUrl(u);
    22
    23 }
    24
    25 }
    26
    27 if(tuBean.getUrl() ==null){
    28
    29 tuBean.setUrl("error");
    30
    31 }

  • 提取出发表时间

不同的时间格式,获取方法是不一样的。这个也是用正则表达式获取:比较常规的

[0-9]{4}-[0-9]{1,2}-[0-9]{1,2}

或者:

[0-9]{4}-[0-9]{2}-[0-9]{1,2}
1 // 获取时间
3 Matcher d = Pattern.compile(rb.getDateRegex()).matcher(rowContent);
5 while (d.find()) {
6
7 tuBean.setDeliveryDate(d.group());
8
9 }

原文地址:https://www.cnblogs.com/siweihz/p/12150017.html

时间: 2024-10-07 06:47:29

从网页中通过正则表达式获取标题等信息(二)实现过程分析的相关文章

C#微信公众号开发之网页授权oauth2.0获取用户基本信息(二)

C#微信公众号开发之网页授权oauth2.0获取用户基本信息(一) 中讲解了如果通过微信授权2.0snsapi_base获取已经关注用户的基本信息,然而很多情况下我们经常需要获取非关注用户的信息,方法如下: 第一步和之前讲的一样:获取code,但是scope使用方法是snsapi_userinfo; 第二步,根据code获取openid和access_token(此处的access_token是通过网页授权code换取的不是我们之前讲的全局的票据),代码: 1 /// <summary> 2

Python中使用正则表达式获取两个字符中间部分

问题背景:当我们爬取网页信息时,对于一些标签的提取是没有意义的,所以需要提取标签中间的信息. 解决办法:用到了re包下的函数 方法1:用到了research()方法和group()方法 方法2:用到了findall()方法 具体实现: import re # 匹配两个字符中间的所有字符 a = '<p>life is short, i use python<a/>i love it<p>' r = re.search('<p>(.*)<a/>(.

Python 爬取网页中JavaScript动态添加的内容(二)

使用 selenium + phantomjs 实现 1.准备环境 selenium(一个用于web应用程测试的工具)安装:pip install seleniumphantomjs(是一种无界面的浏览器,用于完成网页的渲染)下载:http://phantomjs.org/download.html 2.使用 from selenium import webdriver url = 'http://jandan.net/ooxx' driver = webdriver.PhantomJS( ex

Python Show-Me-the-Code 第 0009 题 提取网页中的超链接

第 0009 题:一个HTML文件,找出里面的链接. 思路:对于提取网页中的超链接,先把网页内容读取出来,然后用beautifulsoup来解析是比较方便的.但是我发现一个问题,如果直接提取a标签的href,就会包含javascript:xxx和#xxx之类的,所以要对这些进行特殊处理. 0009.提取网页中的超链接.py #!/usr/bin/env python #coding: utf-8 from bs4 import BeautifulSoup import urllib import

Android中WebView获取网页中标题 ,内容, 图片的方法

如题,在Android中WebView获取网页中标题 ,内容, 图片的方法 首先是获取标题,在new WebChromeClient(){}中重写onReceivedTitle()方法 @Override public void onReceivedTitle(WebView view, String title) { super.onReceivedTitle(view, title); // loge.e("__页面标题__"+title); } 获取内容,是参考的这边的 http

正则表达式相关:C# 抓取网页类(获取网页中所有信息)

类的代码: 1 using System; 2 using System.Data; 3 using System.Configuration; 4 using System.Net; 5 using System.IO; 6 using System.Text; 7 using System.Collections.Generic; 8 using System.Text.RegularExpressions; 9 using System.Threading; 10 using System

[转]正则表达式相关:C# 抓取网页类(获取网页中所有信息)

using System; using System.Data; using System.Configuration; using System.Net; using System.IO; using System.Text; using System.Collections.Generic; using System.Text.RegularExpressions; using System.Threading; using System.Web; using System.Web.UI.M

php获取网页中图片与DIV内容实例

分享下php获取网页中图片.DIV内容的简单方法,都是通过正则表达式实现的. 1.获取网页中所有的图片: <?php //取得指定位址的內容,并储存至 $text $text=file_get_contents('http://www.jbxue.com/'); //取得所有img标签,并储存至二维数组 $match 中 preg_match_all('/<img[^>]*>/i', $text, $match); //打印出match print_r($match); ?>

用正则表达式抓取网页中的ul 和 li标签中最终的值!

获取你要抓取的页面 const string URL = "http://www.hn3ddf.gov.cn/price/GetList.html?pageno=1";            string htmlStr = null;            for (int i = 0; i < 10; i++)            {                try                {                    System.Net.Http