【问题标题】:Beginner issues grabbing HREF from Python BeautifulSoup involving list comprehension从 Python BeautifulSoup 获取 HREF 涉及列表理解的初学者问题
【发布时间】:2015-05-27 12:11:52
【问题描述】:

我已经用我的代码将 HTML 缩小到一个点,但是我在使用列表解析来获取 href 地址时遇到了问题。

这是我的代码(BASE_URL 和 STEM_URL 是固定地址):

soup = BeautifulSoup(requests.get(BASE_URL).text)
divyclass = soup.find("div", {"class":"node-inner"}).tbody

我遇到问题并收到此错误 (TypeError: 'NoneType' object has no attribute '__getitem__') 是在我添加此行以进行列表理解时:

links = [STEM_URL + row.a["href"] for row in divyclass.findAll("td")]

当我跑步时

for row in divyclass.findAll("td"):
    print row

,顺便说一句,我得到了这个输出,这样你就可以看到我从哪里提取 a href:

<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/2007.html">2007</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2006.html">2006</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2005.html">2005</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2004.html">2004</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2003.html">2003</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2002.html">2002</a></td>
<td align="center" class="text" valign="middle" width="25%"><a href="/nba_draft_history/2001.html">2001</a></td>

啊!我只是想拉hrefs!!提前谢谢大家!

【问题讨论】:

    标签: python css-selectors beautifulsoup


    【解决方案1】:

    对于其中没有a 元素的行,row.a 将是None。如果你改变了

    links = [STEM_URL + row.a["href"] for row in divyclass.findAll("td")]
    

    links = [STEM_URL + row.a["href"] for row in divyclass.findAll("td") if row.a]
    

    这将过滤掉没有a 元素的row 元素。

    【讨论】:

    • 感谢@Misandrist! row.a["href"] = True 有什么原因不起作用?还有其他可行的方法吗?
    • @SpicyClubSauce:如果row.aNonerow.a["href"] = True 将引发基本相同的TypeError。您不能索引None 对象来设置值,就像获取值一样;这不是一个集合。
    • @SpicyClubSauce:另外,你为什么要这样做?然后,您将获得href 字符串和无用的True 布尔值的混合,而不是只获得实际的href 字符串。
    • 有道理的家伙。 @abarnert 和 @Misandrist - 如果我只想在 href 标记之后获取这些数字以便添加另一个条件,我将如何处理?即links = [STEM_URL + row.a["href"] for row in divyclass.findAll("td") if row.a and int(row.a["href"].text) &gt;= 2010] 这不起作用,因为 str 对象没有文本属性?
    • 更新:我发现使用它来代替,但它不会比较更远的一些地址,而不仅仅是 a 标签之间的数字值(即 1980-1989)。处理这些异常的最佳方法是什么? if row.a and int(row.a.contents[0]) &gt;= 2010]
    猜你喜欢
    • 2020-02-07
    • 2011-03-30
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2015-09-21
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多