Xpath不返回图像源

时间:2018-08-09 16:42:12

标签: php xml

我是Web抓取的新手,我想一次抓取几个URL,我创建了一个包含所有URL的数组,并且使用了for循环来获取每个URL。

$urls = [
        "https://escapefromtarkov.gamepedia.com/Weapons",
        "https://escapefromtarkov.gamepedia.com/Headwear",
        "https://escapefromtarkov.gamepedia.com/Face_cover",
        "https://escapefromtarkov.gamepedia.com/Eyewear",
        "https://escapefromtarkov.gamepedia.com/Earpieces",
        "https://escapefromtarkov.gamepedia.com/Chest_rigs",
        "https://escapefromtarkov.gamepedia.com/Body_armor",
        "https://escapefromtarkov.gamepedia.com/Backpacks",
        "https://escapefromtarkov.gamepedia.com/Pouches",
        "https://escapefromtarkov.gamepedia.com/Armbands",
        "https://escapefromtarkov.gamepedia.com/Ammunition",
        "https://escapefromtarkov.gamepedia.com/Weapon_mods",
        "https://escapefromtarkov.gamepedia.com/Meds",
        "https://escapefromtarkov.gamepedia.com/Consumables",
        "https://escapefromtarkov.gamepedia.com/Loot",
        "https://escapefromtarkov.gamepedia.com/Keys_%26_Intel",
        "https://escapefromtarkov.gamepedia.com/Containers"
    ];


for($i = 0; $i < count($urls); $i++)
{
    $html = file_get_contents($urls[$i]);

    $wiki_doc = new DOMDocument();

    libxml_use_internal_errors(TRUE);

    $wiki_doc->loadHTML($html);
    libxml_clear_errors();

    $wiki_xpath = new DOMXPath($wiki_doc);
    $wiki_row = $wiki_xpath->query('//table[@class="wikitable"]/tbody/tr/td/a/img/@src');

    foreach($wiki_row as $row)
    {
        $row->nodeValue;
    }
}

我希望获取具有wikitable类的表中每个图像的图像src,但是,当我运行此程序时,没有任何结果。

2 个答案:

答案 0 :(得分:1)

tbody元素由浏览器添加。开发人员工具的DOM视图显示了页面的清理/修复/统一的HTML DOM。看实际的来源。

<table class="wikitable sortable">
<tr>
<th>Name
</th>
<th>Image
</th>
<th>Cartridge
</th>
<th>Description
</th></tr>
<tr>
<td><a href="/AK-101" class="mw-redirect" title="AK-101">AK-101</a>
</td>
<td><a href="/AK-101" title="AK-101"><img alt="AK101 Image.png" src="https://d1u5p3...

这里没有tbody,并且class仅包含wikitable。可以在Xpath 1.0中进行匹配,但是需要一点字符串魔术:

//table[contains(concat(' ', normalize-space(@class), ' '), ' wikitable ')]/tr/td/a/img/@src

答案 1 :(得分:0)

XPath存在两个问题,第一个问题是使用@class="wikitable"意味着如果元素中还有其他类,则此操作将无效。您应该改为说该课程是否包含您的课程。第二个是原始文档中没有<tbody>元素。所以XPath行应该是

$wiki_row = $wiki_xpath->query('//table[contains(@class,"wikitable")]/tr/td/a/img/@src');