0

我是 Php 的新手,正在尝试复制我在 c# 中使用的类来进行网络抓取。我已经为下载页面等构建了一个标准的 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";

这可能吗?

4

2 回答 2

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 : '';

在这里使用三元运算符将有助于保持代码简短并避免 if-then-else 汤。

于 2012-12-12T10:53:06.397 回答
0

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

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

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

于 2012-12-13T08:55:51.363 回答