首页 > 解决方案 > 我不明白为什么 Beautiful Soup 给出第一个链接而不是第二个,第一个 select_one 不会像第二个那样工作

问题描述

我正在用 Beautiful Soup 做一些 Python 编码。我现在让它工作了,但我不知道它为什么工作,我很确定这会导致我在前进时遇到问题。谁能帮我理解这一点?

我已经下载了一个 HTML 文件,该文件在一个表格中有数百个项目。这是一个表项:

<td class="gsc_a_t">
  <a href="www.the_first_link.com" class="gsc_a_at">The title that goes with the link</a>
  <div class="gs_gray">author1, author 2, author 3</div>
  <div class="gs_gray">
    ”source for the item”
    <span class="gs_oph">, 2020</span>
  </div>
</td>
<td class="gsc_a_c">
  <a href="www.the_second_link.com” class="gsc_a_ac gs_ibl">2</a>
</td>
<td class="gsc_a_y">
  <span class="gsc_a_h gsc_a_hc gs_ibl">2020</span>
</td>

以下是每个表项的代码:

for i in table_results:
    item = i
    first_link = i.a['href']
    title = i.a.text
    authors = i.select_one('.gs_gray').text
    source = i.select('.gs_gray')[-1].text
    second_link = i.select_one('.gsc_a_ac')['href']
    citations = i.select_one('.gsc_a_ac').text
    year = i.select_one('.gsc_a_y').text

当我运行它时,我想first_link记录第一个链接并second_link获取第二个链接。他们正在这样做……但我不知道为什么。为什么不从第二个链接而不是第一个链接first link捕获?i.a['href']两者具有相同的<a href=" ... ></a>结构。另外,我尝试first_link = i.select_one('.gsc.a.at')['href']以类似于捕获第二个链接的方式进行操作,但这不起作用。它引用“return self.attrs[key]”并说 KeyError: 'href'

我看过 Beautiful Soup 文档,但我不明白这一点。

标签: pythonhtmlbeautifulsoup

解决方案


为什么第一个链接不从第二个链接而不是第一个链接捕获 ia['href'] ?

我没有方便的参考,但使用点表示法选择具有特定名称的第一个元素。这相当于使用select_onecss 选择器。这导致我们:

first_link = i.select_one('.gsc.a.at')['href']...说KeyError:'href'

这是因为select_one选择第一个满足规定条件的元素(在这种情况下,具有指定的类属性值)。在 html 中,第一个满足该条件的元素是 first td,它本身没有href属性。您正在寻找的是athat 的子元素td

i.select_one('.gsc_a_t a')['href']

推荐阅读