我正在尝试从以下img标签中获取alt标签...
<div class="localImage">
<a href="/Electronic-Deals/b/ref=amb_link_185249707_2?ie=UTF8&node=4192584031&pf_rd_m=A1VBAL9TL5WCBF&pf_rd_s=center-new-12&pf_rd_r=07C4YQ4KZ15MZJQBT2PD&pf_rd_t=701&pf_rd_p=736512207&pf_rd_i=20">
<img src="http://g-ecx.images-amazon.com/images/G/31/rcx-events/cat-navs-electronics1._V335880105_.png" alt="Electronics" border="0" height="140" width="170"></a>
</div>
Run Code Online (Sandbox Code Playgroud)
为此,我尝试了以下代码...
$dom = new DOMDocument();
@$dom->loadHTML($html2);
foreach($dom->getElementsByClassName("localImage") as $tr) {
$name = '';
foreach($tr->getElementsByTagName('img') as $i)
{
$name = $i->getAttribute('alt');
}
echo $name;
Run Code Online (Sandbox Code Playgroud)
但是出现以下错误...
Call to undefined method DOMDocument::getElementsByClassName()
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决哪里出错了...因为我之前尝试过这种代码模式,但从未遇到过此类问题。
DOMDocument类不包含getElementsByClassName
使用xpath的方法
$xpath = new DOMXpath($dom);
$xpath->query('//div[contains(@class, "localImage")]'); //instance of DOMNodeList
Run Code Online (Sandbox Code Playgroud)
PHP的DOMDocument不支持该方法。Xpath可以模拟它。任何不返回伪元素的CSS3选择器都可以转换为Xpath表达式。
因此,要匹配CSS类属性,您必须了解其工作方式。CSS类是令牌属性。它包含几个用空格分隔的类名。在Xpath中,这是一种可以将空格标准化为单个空格的方法。如果在class属性上使用它,并在前面和后面添加一个空格,则任何与该模式匹配的标记{space}ClassOne{space}。使用几个令牌,您最终会得到类似的信息{space}ClassOne{space}ClassTwo{space}ClassThree{space}。确实包含Class但不包含的导入部分{space}Class{space}。
CSS选择器.className可以转换为Xpath表达式.//*[contains(concat(" ", normalize-space(@class), " "), " className ")]。第一部分对属性进行规范化,以便它与令牌匹配,而不仅与可能是令牌名称一部分的字符串匹配。
在您的情况下,您可以优化以匹配div元素:
.//div[contains(concat(" ", normalize-space(@class), " "), " localImage ")]
要使用Xpath,您需要为文档创建一个DOMXpath实例。
$document = new DOMDocument();
$document->loadHTML($html2);
$xpath = new DOMXpath($document);
$expression = './/div[contains(concat(" ", normalize-space(@class), " "), " localImage ")]';
foreach ($xpath->evaluate($expression) as $div) {
//...
}
Run Code Online (Sandbox Code Playgroud)