【问题标题】:Retrieving text from specific class HTML tags and storing into an array in Python从特定类 HTML 标记中检索文本并存储到 Python 中的数组中
【发布时间】:2021-02-09 23:35:22
【问题描述】:

我正在创建一个 Discord 机器人,我从底部开始。我试图解决的第一部分是使用 BeautifulSoup。我当前的代码:

soup = BeautifulSoup(page, 'html.parser')
pbe_titles = soup.find_all('h1', attrs={'class': 'news-title'})
for tag in pbe_titles :
  print(tag.text.strip()) 

到目前为止,这正是我需要它做的。
它检索由类“news-title”标识的标签之间的所有文本,即 <h1 class="news-title">text here</h1> 并打印出与该类关联的所有标签的所有文本。现在,我想获取 BeautifulSoup 找到的所有这些标题,并将它们存储到一个数组中,我可以将其打印到我的 discord 客户端中。

soup = BeautifulSoup(page, 'html.parser')
pbe_titles = soup.find_all('h1', attrs={'class': 'news-title'})
for tag in pbe_titles :
  totalTags = [tag.text.strip()]


@client.event
async def on_message(message):
    if message.author == client.user:
        return

    if message.content.startswith('$show'):
        await message.channel.send(totalTags)

client.run(os.getenv('TOKEN'))

我在这里遇到的问题是totalTags = [tag.text.strip()] 只返回一个标题,而不是全部。但如果我只是坚持print(tag.text.strip()),它将打印 15 个以上的标题。我的阵列做错了什么?

【问题讨论】:

  • totalTags = [tag.text.strip() for tag in pbe_titles] ?
  • 你当前的代码会覆盖而不是追加
  • 在解决该部分后,我有一个后续问题。如果我想使用 BeautifulSoup 在我已经存在的标签中查找其他标签,我该怎么做?例如——在每个标题中,都有一个嵌入的 href 链接作为其指向另一个网站的链接——有没有办法创建一个二维数组来存储与每个标题关联的链接?
  • 在列表理解中生成元组,然后转换为数据框。迭代器将是两个目标元素的父元素,或者如果与子/兄弟匹配作为另一个匹配,则为目标。

标签: python web-scraping beautifulsoup discord.py read-eval-print-loop


【解决方案1】:

所以在 python 中,你想要一个列表。您可以将其分解为生成器函数并将其转换为如下列表:

def get_titles(soup):
    pbe_titles = soup.find_all('h1', attrs={'class': 'news-title'})
    for tag in pbe_titles :
        yield tag.text.strip()

soup = BeautifulSoup(page, 'html.parser')
titles = list(get_titles(soup))
print(titles)

或者你可以只使用列表推导

titles = [tag.text.strip() 
          for tag in soup.find_all('h1', attrs={'class': 'news-title'})]

【讨论】:

  • 我有两个问题,但谢谢,这开始得到我需要的地方 1:所以输出只是一个段落块,而不是单独分隔每个标题 - 有没有办法改变它,所以每个标题都是数组中自己的元素? 2:当我打印时,它分别在标题段落块的开头和结尾留下左括号和右括号。有没有办法摆脱这些?
  • 上面的代码应该准确地为您提供字符串(标题)列表。你可以提供更多关于你想要达到的目标的背景信息,我也许可以回答更多。
  • final_titles = '\n'.join(titles) 我实际上可以这样做——我只是不想要每个标题之间没有“新行”的文本块
猜你喜欢
  • 2015-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多