首页 > 解决方案 > 无法抓取页面的同一部分,唯一的区别是 div 和 span

问题描述

我目前正在尝试学习刮,因此我正在尝试刮 futbin 以获取 FIFA 球员的统计数据。我现在正在 Gary Lineker 的这个链接上工作(例如)。当我试图抓取他的统计数据时(例如加速)。它仅适用于数字,而不适用于实际文本。

这两者一起工作并形成一个包含统计数据的列表。

stats = doc.xpath('//*[@class="stat_val"]/text()')

<div class="stat_val">90</div>

但是,这两个没有创建任何内容,只是一个空列表。

statNames = doc.xpath('//span[@class="ig-stat-name-tooltip tooltipstered"]/text()')

<span class="ig-stat-name-tooltip tooltipstered">Acceleration</span>

可以这么说,两者都在同一组中。这是完整的代码:

<div class=" row_sep sub_stat">
    <div class="stat_holder_sub  left_stat_name" style="display: inline-block;">
        <span class="ig-stat-name-tooltip tooltipstered">Acceleration</span>
    </div>
    <div id="sub-acceleration-val-0" class="stat_val  acceleration-val-0 stat_text_dark_green" style="display: inline-block;">
        <div class="stat_diff" style=" display: inline-block;"></div>
        <div class="stat_diff_cards" style=" display: none;"></div>
        <div class="stat_val">90</div>
    </div>
</div>

实际的区别是什么?两者都不应该这样工作吗?

标签: pythonlxml

解决方案


如果您tooltipstered从 xpath 中省略,例如在以下代码中,您将获得您正在寻找的结果:

import requests
from lxml import html

url = 'https://www.futbin.com/19/player/19/Gary%20Lineker/'
page = requests.get(url)
tree = html.fromstring(page.content)
statNames = tree.xpath('//*[@class="ig-stat-name-tooltip"]/text()')

print([res for res in statNames])

结果:

['Pace', 'Acceleration', 'Sprint Speed', 'Shooting', 'Positioning', 'Finishing', 'Shot Power', 'Long Shots', 'Volleys', 'Penalties', 'Passing', 'Vision', 'Crossing', 'FK. Accuracy', 'Short Passing', 'Long Passing', 'Curve', 'Dribbling', 'Agility', 'Balance', 'Reactions', 'Ball Control', 'Dribbling', 'Composure', 'Defending', 'Interceptions', 'Heading Accuracy', 'Marking', 'Standing Tackle', 'Sliding Tackle', 'Physicality', 'Jumping', 'Stamina', 'Strength', 'Aggression']

推荐阅读