我是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";
这可能吗?
答案 0 :(得分:0)
简而言之,你不能像在1行那样做。
DOMXPath::query和DOMElement::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()
您可以轻松扩展该类以返回单个值。