python - BeautifulSoup,试图从包含作者姓名的锚标签中提取文本
问题描述
我正在尝试从这本书网站上抓取一些数据。我需要提取标题和作者。我能够毫不费力地提取标题。但是,当有多个作者时,我在提取作者时遇到问题,因为它们出现在同一行中,并且它们属于标题 h4 中的单独锚标记。
<h4>
"5
. "
<a href="/items/705">The Elements of Style</a>
" by "
<a href="/authors/5107">William Strunk, Jr</a>
", "
<a href="/authors/5108">E. B. White</a>
</h4>
这是我尝试过的:
book_container = soup.find_all('li', class_='item pb-3 pt-3 border-bottom')
for container in book_container:
# title
title = container.h4.a.text
titles.append(title)
# author(s)
author_s = container.h4.find_all('a')
print('### SECOND FOR LOOP ###')
for a in author_s:
if a['href'].startswith('/authors/'):
print(a.text)
我想在一个元组中有两个作者。
解决方案
这可能不是最 Pythonic 的方式,但它是一种解决方法。
newlist = []
for a in author_s:
if a['href'].startswith('/authors/'):
if len(author_s)>2:
newlist.append(a.text)
print(tuple(newlist))
else:
print(a.text)
我正在利用变量author_s
将包含一个我们可以检查更多名称的列表这一事实。列表中超过 2 个,意味着更多的作者。(或者,您也可以检查打印中是否存在换行符)
您还会注意到打印输出将有两个元组。总是提取第二个。一位作者的其余部分将保持不变。由于此请求没有多行两位作者,因此我无法检查并发症。
输出:
[<a href="/items/705">The Elements of Style</a>, <a href="/authors/5107">William Strunk, Jr</a>, <a href="/authors/5108">E. B. White</a>]
### SECOND FOR LOOP ###
('William Strunk, Jr',)
('William Strunk, Jr', 'E. B. White')
推荐阅读
- php - Laravel 迁移时的 PDOException::("could not find driver")。PHP 版本是 7.3.7。扩展名在 php.ini 中未注释。不知道还能做什么
- node.js - Nodejs Cognito cognitoUser.authenticateUser() 在 lambda 上获得 502 bad gateway
- autodesk-forge - 是否可以通过 Revit API 或 FORGE API 在 Revit 模型中加载新的 Cloud (BIM 360) 链接?
- python - Dango 2.2 使用关键字参数反转“激活”
- phpstorm - WebStorm 和 PhpStorm 中所有项目的相同 SFTP 远程主机
- python - 在 Python 中导入 Dialogflow 时出错
- assembly - x86 程序集:尝试反转打印数组时出现分段错误(核心转储)
- php - 如何获取完整的 URL 以在 laravel 中显示
- sas - 合并两个数据集
- c - memcpy 导致分段错误