python 从字符串获取最后一个线段

col17t5w  于 2023-01-04  发布在  Python
关注(0)|答案(1)|浏览(158)

我有一个字符串,我需要从末尾(从开头到 *)获取某个段

Stockfish level 5 - Anon. • lichess.orgAccessibility: Enable blind mode

lichess.orgPlaylichess.orgCreate a gameArena tournamentsSwiss tournamentsSimultaneous exhibitionsPuzzlesPuzzlesPuzzle DashboardPuzzle StreakPuzzle StormPuzzle RacerLearnChess basicsPracticeCoordinatesStudyCoachesWatchLichess TVCurrent gamesStreamersBroadcastsVideo libraryCommunityPlayersTeamsForumBlogToolsAnalysis boardOpening explorerBoard editorImport gameAdvanced search

Sign in∞ • Casual • Correspondence 20 minutes agoStockfish level 5AnonymousCorrespondence Chess • Stockfish level 5 vs Anon.Stockfish level 5 plays Anon. in a casual Correspondence game of chess. Game is still being played after 1 moves. Click to replay, analyse, and discuss the game![Event "Casual Correspondence game"]
[Site "https://lichess.org/dtkxPuQf"]
[Date "2023.01.02"]
[White "lichess AI level 5"]
[Black "Anonymous"]
[Result "*"]
[UTCDate "2023.01.02"]
[UTCTime "12:43:13"]
[WhiteElo "?"]
[BlackElo "?"]
[Variant "Standard"]
[TimeControl "-"]
[ECO "B00"]
[Opening "King's Pawn"]
[Termination "Unterminated"]

1. e4 *Reconnecting

输出:1. e4
我尝试了text[text.find('1. '):].partition("*")[0],但有时它输出“]”而不是所需的值
我需要从游戏中获得时间感的移动并通知我新的移动

xdyibdwo

xdyibdwo1#

不是从Lichess网页(https://lichess.org/dtkxPuQf)检索特定游戏的HTML,然后解析文本表示以提取移动,而是更容易为此使用Lichess API Package 器。
比较以下两种溶液。

将网页解析为文本内容

像上一个问题/答案中那样使用requestsbs4

  • 检测线的增量

您的应答尝试为:

while True:
    r = requests.get(URL_TEMPLATE)
    soup = bs(r.text, "lxml")

    main_buffer = soup.text[soup.text.find('1. '):].partition("*")[0]

    while True:
        buffer = bs(requests.get(URL_TEMPLATE).text, 'lxml').text[soup.text.find('1. '):].partition("*")[0]  # issue here
        if len(main_buffer) < len(buffer):
            main_buffer = buffer
            break

    print(main_buffer)

现在您遇到了text[soup.text.find('1. '):].partition("*")[0]的问题。

为Lichess API使用 Package 器

类似问题请参见my answer
使用pip install python-lichess安装 Package 器,然后获取game-ID 'dtkxPuQf'指定的给定game的移动:

import lichess.api

game = lichess.api.game('dtkxPuQf')
print(game)  # test update by 'lastMoveAt': 1672665999834, 'status': 'started'

print(game['moves'])  # moves as list of str in PGN-notation, order as played

图纸:

e4 d6 d4 e6 Bd3 h5 Nf3 g5 Bxg5 f5

第一个移动是第一个元素game['moves'].split()[0](这里是e4),最后一个移动是game['moves'].split()[-1](这里是f5)。

轮询更新

一个循环可以轮询API的游戏资源,并与保存的game对象(dict)进行比较。要检测在此期间是否发生了更新,我们只需检查以下3项:

  1. game['lastMoveAt']:如果时间戳未更改,则为最新。
  2. game['status']:如果有人辞职,那么它将发生变化-没有任何进一步的移动发生。
  3. game['moves']:这里的区别是同时附加的移动。
    所以我们需要两个变量来比较博弈状态x一米十四氮一x和x一米十五氮一x。
    • 警告:**请注意Lichess API的速率限制:

使用各种策略对所有请求进行速率限制,以确保API对每个人都保持响应。一次只能发出一个请求。如果收到状态为429的HTTP响应,请等待一整分钟,然后再继续使用API。
因此,您应该使用适当的轮询间隔,以便在请求之间有足够长的延迟。

另请参见

相关问题