我尝试使用this site从PHP Simple HTML DOM PARSER提取包含文字的文章的链接。
我想在主页面中提取文章的所有h2
标记,并且我试图这样做:
$html = file_get_html('http://www.winbeta.org');
$articles = $html->getElementsByTagName('article');
$a = null;
foreach ($articles->find('h2') as $header) {
$a[] = $header;
}
print_r($a);
根据手册,它应首先获取article
标签内的所有内容,然后为每篇文章提取h2并保存在数组中。但相反它给了我:
答案 0 :(得分:4)
有几个问题:
getElementsByTagName
显然会返回单个节点,而不是数组,因此如果页面上有多个 article 标记,则无效。而是使用确实返回数组的find
; find
的结果使用find
,因此您应该对每个匹配的文章标记执行此操作,或者更好地使用组合选择器作为find
的参数; ->plaintext
显式检索节点的文本内容,否则您将获得该节点的对象表示及其所有属性和内部结构; ’
等HTML实体。这些可以使用html_entity_decode
进行解码。所以这段代码应该有效:
$a = array();
foreach ($html->find('article h2') as $h2) { // any h2 within article
$a[] = html_entity_decode($h2->plaintext);
}
使用array_map
,你也可以这样做:
$a = array_map(function ($h2) { return html_entity_decode($h2->plaintext); },
$html->find('article h2'));
如果您还需要检索文章中的其他标签,将文本存储在不同的数组中,那么您可以执行以下操作:
$a = array();
$b = array();
foreach ($html->find('article') as $article) {
foreach ($article->find('h2') as $h2) {
$a[] = html_entity_decode($h2->plaintext);
}
foreach ($article->find('h3') as $h3) {
$b[] = html_entity_decode($h3->plaintext);
}
}