HTML 使用 Beautiful Soup w 时出现列表理解问题 Python

HTML list comprehension issue while using Beautiful Soup w Python

我已经缩小了 HTML 的范围,如果 a 标签后面的内容是 2010 年以后,我想从每一行中提取 href。执行此操作的最佳方法是什么?我先 post 我的代码,然后 HTML.

代码:

links = [STEM_URL + row.a["href"] for row in divyclass.findAll("td") if row.a and int(row.a.contents[0]) >= 2010]

HTML:

<td align="center" class="tableheader" colspan="4" valign="middle">NBA Drafts</td>
<td align="center" class="text" valign="middle"> </td>
<td align="center" class="text" valign="middle"> </td>
<td align="center" class="text" valign="middle"> </td>
<td align="center" class="text" valign="middle"><a href="/nba_final_draft/2014">2014</a></td>
<td align="center" class="text" valign="middle"> <a href="/nba_final_draft/2013">2013</a></td>
<td align="center" class="text" valign="middle"> <a href="/nba_final_draft/2012">2012</a></td>
<td align="center" class="text" valign="middle"><a href="/nba_final_draft/2011">2011</a></td>
<td align="center" class="text" valign="middle"><a href="/nba_final_draft/2010">2010</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_final_draft/2009">2009</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2008.html">2008</a></td>
...
...
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/1989.html">1980-1989</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/1979.html">1970-1979</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/1969.html">1960-1969</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/1959.html">1947-1959</a></td>

如您所见,问题是当我们达到 1989 时,a 标签中的内容开始变成范围,而不是整数,从而弄乱了列表理解中的最后一个条件子句。解决此问题的最佳方法是什么?

截至目前,我的代码可以预见 returns 一个错误 ValueError: invalid literal for int() with base 10: '1980-1989'

可以执行以下操作:

filter = lambda x: x[0] >= 2010 and x[-1] <= 2010
links = [STEM_URL + row.a["href"] for row in divyclass.findAll("td") if row.a and filter(map(int, row.a.contents[0].split('-')))]

根据显示的数据,您可能只假设范围内的第二个值大于第一个值,并且范围始终跨越十年,第一年是 10 的幂。如果该假设是true,那么你的代码可以这么简单:

from urlparse import urljoin
from bs4 import BeautifulSoup

STEM = 'http://www.nba.com'    
html = '''your html here'''
html =+ '<a href="/nba_draft_history/2019.html">2010-2019</a>'
soup = BeautifulSoup(html)
urls = [urlparse.urljoin(STEM, e.get('href')) for e in soup.find_all('a')
            if int(e.text.split('-')[0]) >= 2010]

如果其中一些假设无效,或者您想涵盖更多可能性,您可以这样做:

from urlparse import urljoin
from bs4 import BeautifulSoup

STEM = 'http://www.nba.com'    
html = '''your html here'''
html =+ '<a href="/nba_draft_history/2019.html">2010-2019</a>'
html =+ '<a href="/nba_draft_history/2019.html">2019-2010</a>'
html =+ '<a href="/nba_draft_history/2015.html">2005-2015</a>'
soup = BeautifulSoup(html)

urls = [urlparse.urljoin(STEM, e.get('href')) for e in soup.find_all('a')
            if int(sorted(e.text.split('-'), reverse=True)[0]) >= 2010]