【问题标题】:Game scraping python regular expression游戏抓取python正则表达式
【发布时间】:2015-02-24 21:32:48
【问题描述】:

我正在尝试用 Python 从国际象棋网站上抓取一些游戏文件,但遇到了问题。我的计划是从 html 中删除所有游戏 id,然后将它们插入某个 url 以下载它们。困难的部分实际上是获取游戏 ID。

相关的 html 看起来像这样:

<a class="games right-4" href="/livechess/game?id=1012106017"> View</a>
<a class="games right-4" href="/livechess/game?id=982464559"> View</a>
<a class="games right-4" href="/livechess/game?id=1011988271"> View</a>

我对@9​​87654322@ 部分感兴趣。此外,页面中没有其他以/livechess/... 开头的事件。

如何使用正则表达式提取这些 id?我试过阅读一些东西,但它让我感到困惑而不是帮助。

【问题讨论】:

    标签: python regex web-scraping


    【解决方案1】:

    不要使用正则表达式来解析 HTML。请改用 HTML 解析器。使用BeautifulSoup,这项任务很简单:

    for link in soup.select('a[href^=/livechess/game?id=]'):
        print link['href']
    

    可以通过字符串拆分来获取 id:

    link_id = link['href'].partition('id=')[-1]
    

    带有实时页面的演示:

    >>> import requests
    >>> from bs4 import BeautifulSoup
    >>> r = requests.get('http://www.chess.com/members/view/MagnusCarlsen')
    >>> soup = BeautifulSoup(r.content)
    >>> for link in soup.select('a[href^=/livechess/game?id=]'):
    ...     print link['href']
    ... 
    /livechess/game?id=998801933
    /livechess/game?id=998801191
    /livechess/game?id=998801076
    /livechess/game?id=998801451
    /livechess/game?id=998801336
    /livechess/game?id=998801799
    /livechess/game?id=998801568
    /livechess/game?id=998800852
    /livechess/game?id=998802049
    /livechess/game?id=998800982
    

    【讨论】:

    【解决方案2】:

    正则表达式和 BeautifulSoup 的组合。

    In [14]: for i in soup.find_all('a', href=re.compile("^/livechess/game\?id=")):
        ...:         print(re.split(r'id=', i['href'])[1])
        ...:     
    998801933
    998801191
    998801076
    998801451
    998801336
    998801799
    998801568
    998800852
    998802049
    998800982
    

    【讨论】:

      猜你喜欢
      • 2013-08-21
      • 1970-01-01
      • 2020-09-28
      • 1970-01-01
      • 1970-01-01
      • 2014-10-23
      • 2018-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多