You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Beautiful Soup构建Discord爬虫Bot时,如何逐个提取并格式化输出爬取到的书名

如何将爬取的书名逐个拼接成Discord消息格式?

看起来你已经成功爬取到目标书名了,问题出在对a.string的理解和消息拼接的方式上——咱们一步步来解决:

问题根源

你循环里的每一个a标签对应单个书名,所以a.string本身就是完整的书名字符串(比如第一次循环是"Raymond Carver",第二次是那串长书名)。这时候用a.string[索引]自然只会取这个字符串里的单个字符,而不是多个书名的列表元素。

解决方案1:循环逐个追加字符串

初始化一个空的message变量,然后在遍历每个书名时,把它按你要的格式追加进去:

import requests, urllib3
from bs4 import BeautifulSoup
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

name = "Raymond"
r = requests.get("https://1lib.ch/s/{}?order=bestmatch".format(name), verify=False)
soup = BeautifulSoup(r.text, "lxml")

message = ""
for a in soup.find_all("a", style="text-decoration: underline;", limit=2):
    # 每个书名后加两个换行,和你想要的格式一致
    message += f"{a.string}\n\n"

# 可选:去掉末尾多余的换行,避免消息最后出现空行
message = message.strip()

# 现在message就是你要的格式了
print(message)

解决方案2:用列表收集+join拼接(更高效简洁)

先把所有书名收集到列表里,再用join方法一次性拼接成目标格式,这种方式处理大量数据时更高效:

import requests, urllib3
from bs4 import BeautifulSoup
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

name = "Raymond"
r = requests.get("https://1lib.ch/s/{}?order=bestmatch".format(name), verify=False)
soup = BeautifulSoup(r.text, "lxml")

# 列表推导式收集所有书名
book_titles = [a.string for a in soup.find_all("a", style="text-decoration: underline;", limit=2)]
# 用两个换行符连接所有书名
message = "\n\n".join(book_titles)

print(message)

额外提示

如果担心爬取的a.string可能为空(比如某些标签没有文本),可以加个判断过滤掉空值:

book_titles = [a.string for a in soup.find_all("a", style="text-decoration: underline;", limit=2) if a.string]

内容的提问来源于stack exchange,提问作者Scorpio

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 11:09:08