如何用PHP收集网站元素数据

时间:2012-12-12 10:19:59

标签: php xpath web-scraping

我是Php的新手,我正在尝试复制我在c#fro web-scraping中使用的类。 我已经构建了一个标准的Http Helper类来下载页面等,但是我寻求关于抓取元素的建议,因为我找不到任何简单的例子,它们不涉及只输出所有内容的循环。

这是开始

foreach ($nodes as $element) {
        if($element->hasAttribute('class') && $element->getAttribute('class') == "itemgroup"){

            $tempMessage = $element->getElementsByTagName('h3')->item(0)->nodeValue. "\n";

我不想循环遍历所有内容或猜测元素数组中的项目顺序如上所述。我只是希望能够轻微混合:

与dom查询一样:"//div[@id='travel-itemlist']/div[@class='itemgroup']"

我希望能够通过按属性和值获取单个元素来分配值: 例如:一个非工作的例子:

$title = 'Title: ' . $e->getElementsByTagName('p')->item('class[@id='thatstheOne'')->nodeValue. "\n";

这可能吗?

2 个答案:

答案 0 :(得分:0)

简而言之,你不能像在1行那样做。

DOMXPath::queryDOMElement::getElementsByTagName都会返回一个DOMNodeList对象,该对象可以是一个空列表。

为了真正精确地匹配DOM,当你期望一个结果时,我会使用XPath表达式,然后测试xpath函数的返回值并相应地分配一个变量,例如:

$items = $xpath->query("//div[@id='travel-itemlist']/div[@class='itemgroup']");
$title = ($items->length === 1) ? $items->item(0)->nodeValue : '';

在这里使用Ternary Operators有助于保持代码简短,避免使用if-then-else汤。

答案 1 :(得分:0)

看看PHP Nokogiri。它允许您以jQuery样式查询DOM,但如果您愿意,仍然可以使用直接xPath查询。 有了这个,你可以做类似

的事情
$topicLinks = $saw->get('#sidebar dl.air-comment a.topic')->toArray()

您可以轻松扩展该类以返回单个值。