내가 사용하고 PHP DOM을 나는 주어진 클래스 이름을 가지고 DOM 노드 내의 요소를 얻기 위해 노력하고있어. 하위 요소를 얻는 가장 좋은 방법은 무엇입니까?
업데이트 :Mechanize
작업하기 훨씬 더 쉬운 PHP를 사용하게 되었습니다.
답변
업데이트 : *[@class~='my-class']
CSS 선택기의 Xpath 버전
그래서 hakre의 의견에 대한 답변으로 아래의 의견을 듣고 호기심이 생겨 Zend_Dom_Query
. 위의 선택기가 다음 xpath로 컴파일 된 것 같습니다 (예상되지 않음).
[contains(concat(' ', normalize-space(@class), ' '), ' my-class ')]
그래서 PHP는 다음과 같습니다.
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
기본적으로 여기에서 수행하는 모든 작업은 class
단일 클래스도 공백으로 묶이고 전체 클래스 목록이 공백으로 묶 이도록 속성을 정규화하는 것입니다. 그런 다음 검색중인 클래스를 공백으로 추가하십시오. 이런 식으로 우리는 my-class
.
xpath 선택기를 사용 하시겠습니까?
$dom = new DomDocument();
$dom->load($filePath);
$finder = new DomXPath($dom);
$classname="my-class";
$nodes = $finder->query("//*[contains(@class, '$classname')]");
한 가지 유형의 요소 일 *
경우를 특정 태그 이름으로 바꿀 수 있습니다 .
매우 복잡한 선택기로이 작업을 많이 수행해야하는 경우 Zend_Dom_Query
CSS 선택기 구문 (jQuery)을 지원하는 것이 좋습니다 .
$finder = new Zend_Dom_Query($html);
$classname = 'my-class';
$nodes = $finder->query("*[class~=\"$classname\"]");
답변
zend없이 클래스의 innerhtml을 얻으려면 다음을 사용할 수 있습니다.
$dom = new DomDocument();
$dom->load($filePath);
$classname = 'main-article';
$finder = new DomXPath($dom);
$nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' $classname ')]");
$tmp_dom = new DOMDocument();
foreach ($nodes as $node)
{
$tmp_dom->appendChild($tmp_dom->importNode($node,true));
}
$innerHTML.=trim($tmp_dom->saveHTML());
echo $innerHTML;
답변
나는 받아 들여지는 방법이 더 낫다고 생각하지만 이것도 잘 작동 할 것 같다
function getElementByClass(&$parentNode, $tagName, $className, $offset = 0) {
$response = false;
$childNodeList = $parentNode->getElementsByTagName($tagName);
$tagCount = 0;
for ($i = 0; $i < $childNodeList->length; $i++) {
$temp = $childNodeList->item($i);
if (stripos($temp->getAttribute('class'), $className) !== false) {
if ($tagCount == $offset) {
$response = $temp;
break;
}
$tagCount++;
}
}
return $response;
}
답변
를 사용하지 않고 다른 방법도 있습니다 DomXPath
또는 Zend_Dom_Query
.
dav의 원래 함수를 기반으로 태그와 클래스가 매개 변수와 일치하는 부모 노드의 모든 자식을 반환하는 다음 함수를 작성했습니다.
function getElementsByClass(&$parentNode, $tagName, $className) {
$nodes=array();
$childNodeList = $parentNode->getElementsByTagName($tagName);
for ($i = 0; $i < $childNodeList->length; $i++) {
$temp = $childNodeList->item($i);
if (stripos($temp->getAttribute('class'), $className) !== false) {
$nodes[]=$temp;
}
}
return $nodes;
}
$html
다음 HTML 변수가 있다고 가정합니다 .
<html>
<body>
<div id="content_node">
<p class="a">I am in the content node.</p>
<p class="a">I am in the content node.</p>
<p class="a">I am in the content node.</p>
</div>
<div id="footer_node">
<p class="a">I am in the footer node.</p>
</div>
</body>
</html>
의 사용 getElementsByClass
은 다음과 같이 간단합니다.
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
$content_node=$dom->getElementById("content_node");
$div_a_class_nodes=getElementsByClass($content_node, 'div', 'a');//will contain the three nodes under "content_node".
답변
DOMDocument 는 입력 속도가 느리고 phpQuery 에는 잘못된 메모리 누수 문제가 있습니다. 나는 결국 다음을 사용했습니다.
https://github.com/wasinger/htmlpagedom
클래스를 선택하려면 :
include 'includes/simple_html_dom.php';
$doc = str_get_html($html);
$href = $doc->find('.lastPage')[0]->href;
다른 사람에게도 도움이되기를 바랍니다.