我通过php cURL抓取/提取远程网页。为此,我必须查看php脚本的页面源代码。问题是在远程页面中,某些文本在<pre></pre>
标记内。所以,我可以看到换行符或其他html实体代码,我想逐个抓取该网页。
例如,如果您看到http://dsebd.org/market-statistics.php的网页来源,则可以看到TODAY'S SHARE MARKET
下的数据显示在<pre></pre>
标记下。由于<pre>
保留换行符,所以我不能假设在每行数据之后有什么。
如何使用该换行符/换行符/等html实体代码查看页面源?
答案 0 :(得分:1)
您想将<pre></pre>
标记内的文字转换为HTML吗?首先,nl2br
函数会在每个新行后添加<br>
个标记。
其他一切似乎只是空格,所以我会这样做:
$readable_text = str_replace(' ',' ',$html)
但是,如果你不想一块一块地抓取数据,那就是标准格式,所以你需要做的就是用简单的正则表达式来抓取它。所以说你需要从每个文本块中获取数据:
All Category
ISSUES ADVANCED : 133
ISSUES DECLINED : 164
ISSUES UNCHANGED : 33
TOTAL ISSUES TRADED : 330
A Category (Equity)
ISSUES ADVANCED : 101
ISSUES DECLINED : 138
ISSUES UNCHANGED : 27
您可以使用新行搜索并提取所需的特定数据。首先,我将每个块加载到一个数组中。
注意:我看到示例中的<pre></pre>
标记有两个主要部分,第二部分是:
PRICES IN PUBLIC TRANSACTIONS : 2017-03-19
==========================================
您必须将这两个部分分开并单独处理它们。因此,对于这项工作(我假设它从文本中提取每个单独的数据位),步骤是:
有两种方法可以做到这一点,要么爆炸一切(因为每个部分和子部分由不同数量的新行分隔,这将有效地工作),如下所示:
$sections = explode('\n\n\n\n',$pre_text)
或使用正则表达式提取所有内容(或使用两种方法的组合)。我将在此示例中使用正则表达式,并且不会解释第1步,只是第2步和第3步。
要将第一部分中的每个块拆分为一个数组,可以使用此正则表达式:
$pattern = '/([A-Za-z \(\)]+)\n(.*?)\n\n/ms';
preg_match_all($pattern,$text,$blocks);
在此处查看此操作: http://www.phpliveregex.com/p/jri ^^选择 preg_match_all 或者它不会工作
现在 $ blocks 是一个包含每个块的数组,因为我使用的模式有两个捕获组,数组包含每个块的标题,文本本身,下面是数组的样子:
因此,假设您想要从每个块中获取每个数据,只需循环遍历每个块并运行另一个使用空格来捕获有用数据的正则表达式,因此它将是这样的:
foreach($matches as $block) {
preg_match_all('/([A-Za-z \(\).]+)[ ]+:[ ]+(.*?)\n/ms',$block,$lines)
}