xpath - 对 XPath 语法感到困惑
问题描述
- 问题总结:
嗨,我正在尝试学习使用 Python 的 Scrapy 框架(可在https://scrapy.org获得)。我正在关注我在这里找到的教程:https ://www.scrapehero.com/scrape-alibaba-using-scrapy/ ,但我打算使用不同的站点进行练习,而不是仅仅在阿里巴巴上复制它们。我的目标是从https://www.mlb.com/scores获取游戏数据。
所以我需要使用 Xpath 告诉蜘蛛要抓取 html 的哪些部分,(我在 scrapehero 网站上的那个教程页面上大约一半,在“为产品列表构建 Xpath 选择器”部分)。问题是我花了很长时间弄清楚实际上应该是什么语法才能得到我想要的片段?我整个早上都在研究 xpath 示例,试图找出正确的语法,但我一直没能得到它。
- 背景资料:
所以我想要的是 - 从https://www.mlb.com/scores,我想要一个 xpath() 命令,它将返回一个显示所有游戏的数组。
按照本教程,我了解如何执行此操作是我想检查网页中的元素,确定它们的类/ID,并在 xpath 命令中具体说明。
我尝试了很多变体来获取数据,但都返回空数组。
我真的没有在 XPath 方面接受过任何培训,所以我不确定我的语法是否只是在某个地方或什么地方,但我真的很感激任何帮助,让这个命令返回我正在寻找的对象。感谢您抽时间阅读。
- 代码:
以下是一些无效的尝试:
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')]")
- 预期结果和实际结果
我想要一个 XPath 命令,它返回一个数组,其中包含 mlb.com/scores 页面上每个游戏的选择器对象。
到目前为止,我已经能够获得实际上不是我想要的通用返回(我可以通过省略谓词来获得一个返回整个页面的选择器,但是每当我尝试指定时,我都会得到一个空数组)。
因此,对于我所有的尝试,我要么得到错误的对象,要么得到一个空数组。
解决方案
您需要始终检查 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
推荐阅读
- stripe-payments - 与条带连接、卡标记化过程和客户生成过程相关的问题
- eclipse - 在 tomcat 项目中构建 WAR 文件
- laravel - Laravel 计划任务无法访问模型的属性
- c# - 如何控制 grpc 中的写入缓冲区大小(或:如何处理 grpc 中的慢流读取器)?
- c# - 组合超过 3 个旋转(四元数)
- javascript - javascript:将相同和不同的键映射到不同的值
- python - 基于每行中至少一个元素的正则表达式匹配的新数据框列
- mysql - 从 mysql 查询返回一个连接的字符串
- javascript - 用户登录时不会显示表单和 div
- php - wordpress 如何实现 php 短代码