python - 我不明白为什么 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 文档,但我不明白这一点。
解决方案
为什么第一个链接不从第二个链接而不是第一个链接捕获 ia['href'] ?
我没有方便的参考,但使用点表示法选择具有特定名称的第一个元素。这相当于使用select_one
css 选择器。这导致我们:
first_link = i.select_one('.gsc.a.at')['href']
...说KeyError:'href'
这是因为select_one
选择第一个满足规定条件的元素(在这种情况下,具有指定的类属性值)。在 html 中,第一个满足该条件的元素是 first td
,它本身没有href
属性。您正在寻找的是a
that 的子元素td
:
i.select_one('.gsc_a_t a')['href']
推荐阅读
- selenoid - 发出连接 Selenoid GGR (Go Grid Router)
- css - 是否可以使用 user-scalable=no 水平滚动?
- google-slides-api - 使用 Google Slides API 有没有办法知道形状中文本的高度?
- php - Laravel "^6.18.35" “目标 [Illuminate\Contracts\Bus\Dispatcher] 不可实例化。”
- amazon-web-services - 分布式设置中的 AWS 数据传输估计值
- javascript - 开玩笑 - 找不到模块
- javascript - 使用 Redux 为 outsideClick 函数创建 HOC
- python - 来自 skimage 但在 Pytorch 中的“view_as_windows”
- python - 如何使用 R 在 MLFlow 中保存模型并在 Azure Databricks 中获取它们的阶段?
- docker - docker multi-stage build Go image - x509:由未知权威签署的证书