Python 如何解析网页中的特定节数据?

Python 如何解析网页中的特定节数据?,python,python-3.x,parsing,web-scraping,beautifulsoup,Python,Python 3.x,Parsing,Web Scraping,Beautifulsoup,我正在尝试使用BeautifulSoup解析页面的特定内容,你能告诉我,我如何才能做到这一点吗? 代码: 我不知道如何进一步进行,我希望输出结果如下 预期产出: 最佳得分手: [{'playerimage':'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=tru

我正在尝试使用BeautifulSoup解析页面的特定内容,你能告诉我,我如何才能做到这一点吗? 代码:

我不知道如何进一步进行,我希望输出结果如下

预期产出:

最佳得分手:

[{'playerimage':'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true','playername':'TP Ura','player-details':'PNG, Right-hand bat','runs':'188','innings':'2','Average':'94.00'},..............................................................................................}]
另一列也一样 最佳小门接受者:

[{'playerimage':'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true','playername':'Ehsan Khan','player-details':'HKG, Right-arm offbreak','wickets':'9','innings':'3','Average':'12.55'},..............................................................................................}]

首先,您正在搜索错误的标签。您需要的内容位于
内,而不是具有相同类名的
div
标记

Top Run Scorers表位于
标记内。每个玩家都位于
li
标签内。您可以在
li
标签中获取玩家的所有详细信息

我将向您展示如何获取顶级得分手的图像、姓名和球员详细信息

输出:

[{'player-details': ', PNG, Right-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'TP Ura'},
 {'player-details': ', AFG, Right-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/25913.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'Mohammad Nabi'},
 {'player-details': ', WI, Left-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'SO Hetmyer'}]

首先,您正在搜索错误的标签。您需要的内容位于
内,而不是具有相同类名的
div
标记

Top Run Scorers表位于
标记内。每个玩家都位于
li
标签内。您可以在
li
标签中获取玩家的所有详细信息

我将向您展示如何获取顶级得分手的图像、姓名和球员详细信息

输出:

[{'player-details': ', PNG, Right-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'TP Ura'},
 {'player-details': ', AFG, Right-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/25913.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'Mohammad Nabi'},
 {'player-details': ', WI, Left-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'SO Hetmyer'}]

选择元素中具有类名
子模块
执行者
的所有列表项,然后分析每个列表项中的播放器详细信息。e、 g


选择元素中具有类名
子模块
执行者
的所有列表项,然后分析每个列表项中的播放器详细信息。e、 g



该页面上似乎没有任何与该类相关的div。当您只是获取和保存HTML(使用Python、curl或其他工具)并在编辑器中打开它时,您看到这样的事情了吗?如果不是,BeautifulSoup显然也不会看到它。如果页面是动态生成的,例如,有一些JavaScript在加载后运行,并在页面中添加了一堆充满新div的“模块”,那么您将无法以这种方式进行操作。(你可以在Python中运行JS引擎,或者驱动浏览器。或者你可以手动计算JS代码在做什么,然后在Python中进行操作。)但首先:在尝试清理之前,你是否检查过ESPN是否有用于此的API?(而且,如果他们没有API,他们的ToS是否禁止删除它?)。当您只是获取和保存HTML(使用Python、curl或其他工具)并在编辑器中打开它时,您看到这样的事情了吗?如果不是,BeautifulSoup显然也不会看到它。如果页面是动态生成的,例如,有一些JavaScript在加载后运行,并在页面中添加了一堆充满新div的“模块”,那么您将无法以这种方式进行操作。(你可以在Python中运行JS引擎,或者驱动浏览器。或者你可以手动计算JS代码在做什么,然后在Python中进行操作。)但首先:在尝试清理之前,你是否检查过ESPN是否有用于此的API?(而且,如果他们没有API,他们的ToS是否禁止删除它?@steve,这不是一个代码编写服务,所以,我不会告诉你如何获得所有细节。使用上面的代码,尝试获取其余的详细信息。我想我已经向你展示了如何继续。你能解释一下这行的作用吗details=info.p.contents[-1]?精确内容[-1]尝试使用
.contents
打印任何元素的内容。您将看到其所有内容的列表。您想要的详细信息出现在列表的最后一个索引中。这就是为什么[-1]@steve,SO不是一个代码编写服务,所以,我不会告诉你如何获得所有细节。使用上面的代码,尝试获取其余的详细信息。我想我已经向你展示了如何继续。你能解释一下这行的作用吗details=info.p.contents[-1]?精确内容[-1]尝试使用
.contents
打印任何元素的内容。您将看到其所有内容的列表。您想要的详细信息出现在列表的最后一个索引中。这就是为什么[-1]我如何将列表播放器的字典集分别划分为3个播放器?您可以使用
itertools.zip\u longest
生成一个分别划分为3个播放器的播放器列表<代码>拆分器=[iter(玩家)]*3;三个=itertools.zip_最长(*拆分器);打印(列出三个)我用了一个计数器来做这件事,你的方法很有趣,从来没有尝试过before@steve,您可以使用
a=players[:3];b=players[3://code>将列表拆分。如何将列表播放器的字典集分别拆分为3个?您可以使用
itertools.zip\u longest
将播放器列表拆分为3个<代码>拆分器=[iter(玩家)]*3;三个=itertools.zip_最长(*拆分器);打印(列出三个)
我用了一个计数器来做这件事,你的方法很有趣,从来没有尝试过before@steve,您可以使用
a=players[:3];b=玩家[3::
以拆分列表。
[{'player-details': ', PNG, Right-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'TP Ura'},
 {'player-details': ', AFG, Right-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/25913.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'Mohammad Nabi'},
 {'player-details': ', WI, Left-hand bat',
  'playerimage': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true',
  'playername': 'SO Hetmyer'}]
r = requests.get("http://www.espncricinfo.com/series/_/id/8038/season/2018/icc-world-cup-qualifiers/"
)

soup = BeautifulSoup(r.text, "html.parser")

toprunners = soup.select(".sub-module.performers li")

def player(li):
    name_and_details = li.select_one('p')
    name = name_and_details.a
    details = name.nextSibling
    stats = li.select_one('.overall-stats p')
    img = li.select_one('.focus-image')

    return {
        'player_name': name.text,
        'player_details': details.strip(', '),
        'player_image': img.attrs['src'],
        'runs': name_and_details.nextSibling.text,
        'innings': stats.span.text,
        'average': stats.nextSibling.span.text,
    }

players = [player(li) for li in toprunners]

In[2]: print(players)

[{'player_name': 'TP Ura', 'player_details': 'PNG, Right-hand bat', 'player_image': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true', 'runs': '188', 'innings': '2', 'average': '94.00'}, {'player_name': 'Mohammad Nabi', 'player_details': 'AFG, Right-hand bat', 'player_image': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/25913.png&h=55&w=40&scale=crop&transparent=true', 'runs': '181', 'innings': '3', 'average': '60.33'}, {'player_name': 'SO Hetmyer', 'player_details': 'WI, Left-hand bat', 'player_image': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true', 'runs': '171', 'innings': '3', 'average': '57.00'}, {'player_name': 'Ehsan Khan', 'player_details': 'HKG, Right-arm offbreak', 'player_image': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true', 'runs': '9', 'innings': '3', 'average': '12.55'}, {'player_name': 'Mujeeb Ur Rahman', 'player_details': 'AFG, Right-arm offbreak', 'player_image': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/default-player-logo-500.png&h=55&w=40&scale=crop&transparent=true', 'runs': '8', 'innings': '3', 'average': '15.25'}, {'player_name': 'JO Holder', 'player_details': 'WI, Right-arm medium-fast', 'player_image': 'http://a.espncdn.com/combiner/i?img=/i/headshots/cricket/players/391485.png&h=55&w=40&scale=crop&transparent=true', 'runs': '7', 'innings': '3', 'average': '21.28'}]