python - 用于 Boardgamegeek 的 Python Webscraper
问题描述
Scraper 的目标是分析哪些棋盘游戏获得最多赞,并将它们打印在排序列表中。基本上是一本“名字:竖起大拇指”的字典。这是我要排序的游戏列表: https ://boardgamegeek.com/geeklist/268396/20-most-anticipated-games-2020-11th-year-nominatio
我在 Python 中使用框架 Scrapy。我发现以下命令可以很好地提取标题并竖起大拇指:
response.css('.fl > a:nth-child(2)::text').getall()
response.css('.recs a::text').getall()
当游戏获得 0 个拇指时,问题就出现了,然后 Scrapy 只是跳过那个拇指。这意味着标题列表不仅仅是竖起大拇指的列表。例如,我可以使用上面的命令获得一个包含 25 个标题的列表和一个包含 20 个赞的列表。有没有办法将空字符串转换为默认值 0,以便名称列表和竖起大拇指列表相等?像:
response.css('.recs a::text').getall(default="0")
当没有竖起大拇指时,它看起来像这样:
<a aria-label="Recommendations and tip info" class="js-score" href="javascript://" onclick="RecSpy( 'listitem', '7520669', 'tippers' ); return false;"></a>
解决方案
不是从主 DOM 中单独收集每个棋盘游戏及其喜欢的东西,而是可以获取包含喜欢和棋盘游戏名称的每个选择器,例如
games = response.css('.mb5') # fetch every selector with class "mb5"
for game in games:
name = game.css('.fl > a:nth-child(2)::text').get()
likes = game.css('.recs a::text').get() or 0
...
伪代码,但我希望你明白。
推荐阅读
- php - 如何查找数组中存在多少对数
- excel - 创建宏以根据多列中的单元格值删除行
- c++ - 如何以编程方式获取使用 CMake 安装库的目录?
- c++ - 为什么这个循环每次迭代需要 1.32 个周期
- c# - Unity get corners of GameObject
- python - 类型提示:输入和输出的相同可变长度元组
- excel - 如何用一行代码冻结第一行
- php - redirect urls from specific folder to external domains (with php?)
- c# - 将操作放入 lambda 会导致 C# 中的 SystemAccessViolation
- node.js - Nodejs urlencode 二进制数据