对XPath语法感到困惑

时间:2019-06-26 17:16:02

标签: xpath scrapy

  1. 问题摘要:

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

因此,我需要使用Xpath告诉Spider抓取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页面上每个游戏的选择器对象的数组。

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

因此,在我所有的尝试中,我都得到了错误的对象或空数组。

1 个答案:

答案 0 :(得分:1)

您需要始终检查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
相关问题