目前我正在从HTML页面抓取数据。我的一个代码不起作用。 HTML内容有类似的内容。
<ul class="pagination">
<li>
<span class="page active">
1
</span>
</li>
<li>
<a class="page available" href="/somethingherewithanychars1">
2
</a>
</li>
<li>
<a class="page available" href="/somethingherewithanychars2">
3
</a>
</li>
<li>
<a class="page available" href="/somethingherewithanychars3">
4
</a>
</li>
<ul>
我尝试使用此代码获取活动页面链接旁边的href值,例如活动页面链接为页码1的示例,因此我将获得的href值必须是页面编号2,其中值为 / somethingherewithanychars1 但它无法正常工作
$file_string = file_get_contents($url);
preg_match('/<li><span class="page active">.*?<\/span><\/li><li><a class="page available" href="(.*)">/i', $file_string, $pages);
print_r($pages);
我访问的html有一些像这样的代码
<div class="attributes">
<a class="name" href="/linksTothissite" data-hovercard-id="somechars">link1</a>
<span class="list">
USA
</span>
<a class="name" href="/linksTothissite" data-hovercard-id="somechars">link2</a>
<span class="list">
CANADA
</span>
</div>
我尝试使用此代码获取值,我可以获取link1和link2
preg_match_all('/<a class="name" href=".*?" data-hovercard-id=".*?">(.*)<\/a>/i', $file_string, $values);
这一个我可以得到美国和加拿大
preg_match_all('/<span class="list">(.*?)<\/span>/s',$file_string, $values);
$val= $values[1];
为什么我的preg_match没有得到我需要的值?我尝试使用pre_match_all(),但我仍然在print_r Array()中得到一个输出,但我的其余代码都可以工作。
答案 0 :(得分:1)
这样做的好方法是将DOM与XPath结合使用,作为Prix编写。
如果您想要检查您要查找的链接是来自具有“分页”类的无序列表中项目的子元素,并检查该项目是“活动页面”项目之后的下一项,查询会有点复杂。
$doc = new DOMDocument();
@$doc->loadHTMLFile($url);
$xpath = new DOMXPath($doc);
$xquery = '//ul[@class="pagination"]' // ul with the "pagination" class
. '/li[descendant::span[@class="page active"]]' // li that contains a span with "page active" class
. '/following-sibling::*[1]' // next sibling (next li)
. '/a/@href'; // href attribute of the a tags
$links = $xpath->query($xquery);
echo $links->item(0)->value;
正则表达式不起作用的原因是:
(.*)"
来描述链接(结果:正则表达式引擎将采用该行的最后一个双引号,而不是它遇到的第一个。)在必要时添加\s*
后,您可以用否定的字符类替换.*
和.*?
:
preg_match('/<li>\s*<span class="page active">[^<]+<\/span>\s*<\/li>\s*<li>\s*<a class="page available" href="([^"]+)">/i', $file_string, $pages);
请记住,当DOM方法始终有效时,html代码中的最小变化会使您的模式失败(只要树结构保持不变)