尝试构建像feed43.com这样的网络抓取脚本。 细节: 我有一个HTML代码如下。
<div id="latest_header" onclick="getNews('79');">
<img src="home_images/arrow.gif"> 2 DAY SEMINAR <br> <label id="news_pagedesp"><img src="home_images/li_desp.gif">NATIONAL SEMINAR..</label><label id="date_label">13th August 2014</label></div>
<div id="latest_header" onclick="getNews('78');">
<img src="home_images/arrow.gif"> 2 DAYS WORKSHOP <br> <label id="news_pagedesp"><img src="home_images/li_desp.gif">INTERNATIONAL WOR..</label><label id="date_label">8th August 2014</label></div>
我写了一个类似下面的表达式。
<div id="latest_header"{*}getNews('{%}'){*} {%}<br>{*}.gif">{%}..</label>
结果应符合以下规则:
{*} - 忽略一切 {%} - 将其用作变量的值
结果应该是给定模式的所有出现。在上述情况下:
{%1} - 79 {%2} - 2天研讨会{%3} - 全国研讨会
{%1} - 78 {%2} - 2天工作坊{%3} - 国际角色
我无法实现正则表达式,并且在许多地方读取遍历html页面是不可行的。 我转移到simple_html_dom,但没有运气以这么简单的方式完成上述事情。至少,我不可能模拟上述事情。
变量{*}&amp;当使用feed43.com创建某个网站的Feed时,{%}用于创建模式。
答案 0 :(得分:0)
您的正则表达式不正确。使用适当的量词来忽略项目,并使用capturing-group来捕获匹配子部分:
/<div id="latest_header"(?>.*?getNews\(')(?>(.*?)'\))(?>.*? )(?>(.*?)<br>)(?>.*?\.gif">)(.*?)<\/label>/s
* 原子组用于消除backtracking。没有它们的这个正则表达式会导致大量的时间回溯,这是主要的caveats with parsing HTML with regex之一。
这将是你的匹配:
MATCH 1: [Group 1: 79] [Group 2: 2 DAY SEMINAR ] [Group 3: NATIONAL SEMINAR..]
MATCH 2: [Group 1: 78] [Group 2: 2 DAYS WORKSHOP ] [Group 3: INTERNATIONAL WOR..]
这是regex demo。
答案 1 :(得分:0)
这可能与此无关,但以下开源项目实现了我想要的目标..
我真正想要的是能够为Feed43.com这样的网页创建RSS源 而hFeeds的工作方式与Feed43 .com完全相同,并且易于使用。 唯一的区别是它使用{h}代替{%}和{i}代替{*}。 它会像我看到的那样生成正则表达式。
但是,谢谢你的回答