gpt4 book ai didi

python - 在 Python 中使用 Beautifulsoup 时出现 HTML 列表理解问题

转载 作者:行者123 更新时间:2023-12-01 04:41:53 25 4
gpt4 key购买 nike

我已经缩小了 HTML 范围,如果 a 标签后面的内容是 2010 年以后的内容,我想从每一行中提取 href。最好的方法是什么?我将首先发布我的代码,然后发布 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 标记中的内容开始变成范围,而不是整数,从而弄乱了列表理解中的最后一个条件子句。解决这个问题的最佳方法是什么?

到目前为止,我的代码可以预见地返回错误 ValueError: invalid Literal for int() with base 10: '1980-1989'

最佳答案

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

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]

关于python - 在 Python 中使用 Beautifulsoup 时出现 HTML 列表理解问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30473215/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com