首页 > 解决方案 > 对 XPath 语法感到困惑

问题描述

  1. 问题总结:

嗨,我正在尝试学习使用 Python 的 Scrapy 框架(可在https://scrapy.org获得)。我正在关注我在这里找到的教程:https ://www.scrapehero.com/scrape-alibaba-using-scrapy/ ,但我打算使用不同的站点进行练习,而不是仅仅在阿里巴巴上复制它们。我的目标是从https://www.mlb.com/scores获取游戏数据。

所以我需要使用 Xpath 告诉蜘蛛要抓取 html 的哪些部分,(我在 scrapehero 网站上的那个教程页面上大约一半,在“为产品列表构建 Xpath 选择器”部分)。问题是我花了很长时间弄清楚实际上应该是什么语法才能得到我想要的片段?我整个早上都在研究 xpath 示例,试图找出正确的语法,但我一直没能得到它。

  1. 背景资料:

所以我想要的是 - 从https://www.mlb.com/scores,我想要一个 xpath() 命令,它将返回一个显示所有游戏的数组。

按照本教程,我了解如何执行此操作是我想检查网页中的元素,确定它们的类/ID,并在 xpath 命令中具体说明。

我尝试了很多变体来获取数据,但都返回空数组。

我真的没有在 XPath 方面接受过任何培训,所以我不确定我的语法是否只是在某个地方或什么地方,但我真的很感激任何帮助,让这个命令返回我正在寻找的对象。感谢您抽时间阅读。

  1. 代码:

以下是一些无效的尝试:

response.xpath("//div[@class='g5-component--mlb-scores__game-wrapper']")
response.xpath("//div[@class='g5-component]")
response.xpath("//li[@class='mlb-scores__list-item mlb-scores__list-item--game']")
response.xpath("//li[@class='mlb-scores__list-item']")
response.xpath("//div[@!data-game-pk-id > 0]")'
response.xpath("//div[contains(@class, 'g5-component')]")
  1. 预期结果和实际结果

我想要一个 XPath 命令,它返回一个数组,其中包含 mlb.com/scores 页面上每个游戏的选择器对象。

到目前为止,我已经能够获得实际上不是我想要的通用返回(我可以通过省略谓词来获得一个返回整个页面的选择器,但是每当我尝试指定时,我都会得到一个空数组)。

因此,对于我所有的尝试,我要么得到错误的对象,要么得到一个空数组。

标签: xpathscrapy

解决方案


您需要始终检查 HTML 源代码(Ctrl+U在浏览器中)以获取所需数据。对于 MLB 页面,您会发现要解析的内容是使用 JavaScript动态加载的。

您可以尝试使用 Scrapy-Splash 从您的 start_urls 获取目标内容,或者您​​可以找到用于获取所需信息的直接 HTTP 请求(使用 Chrome 开发人员工具的网络选项卡)并解析 JSON:

https://statsapi.mlb.com/api/v1/schedule?sportId=1,51&date=2019-06-26&gameTypes=E,S,R,A,F,D,L,W&hydrate=team(leaders(showOnPreview(leaderCategories=[homeRuns,runsBattedIn,battingAverage],statGroup=[pitching,hitting]))),linescore(matchup,runners),flags,liveLookin,review,broadcasts(all),decisions,person,probablePitcher,stats,homeRuns,previousPlay,game(content(media(featured,epg),summary),tickets),seriesStatus(useOverride=true)&useLatestGames=false&language=en&leagueId=103,104,420

推荐阅读