【问题标题】:How do I grab all paragraphs from an article instead of just one?我如何从一篇文章中获取所有段落而不是一个?
【发布时间】:2021-04-08 17:09:37
【问题描述】:

这里是初学者。

我刚刚开始学习 Python,并且正在学习网络爬虫,我想抓取每个段落,然后将它们写入文本文件或 csv 文件。每个段落都有相同的标签名称,所以我认为 for 循环会遍历该名称的每个标签并从每个标签和中提琴中获取文本!...除了它只显示第一段 15 次以上..我假设它这样做的原因是因为它像我告诉它的那样抓取第一个标签,并为与它同名的许多其他标签打印相同的标签。我尝试将 .find 替换为 .find_all 但出现属性错误。如何获取所有段落而不仅仅是一个?

文章:https://www.huffpost.com/entry/angry-squirrel-attacks-queens_n_5fee30b1c5b6ec8ae0b242d2

from bs4 import BeautifulSoup
import requests
import csv

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
    }


url = "https://www.huffpost.com/entry/angry-squirrel-attacks-queens_n_5fee30b1c5b6ec8ae0b242d2"

response = requests.get(url, headers=headers).text

soup = BeautifulSoup(response, 'lxml')

article = soup.find('article')

headline = article.header.h1.text
print(headline)

headline_Sub = article.find('div', class_="headline__subtitle").text
print(headline_Sub)

print('')

for summaries in article.find('div', class_="entry__text js-entry-text yr-entry-text"):
    p = article.find('div', class_='content-list-component yr-content-list-text text').p.text
    print(p)

使用 find_all 的 for 循环反而会返回错误:

Traceback(最近一次调用最后一次):文件 "C:\Users\Denze\MyPythonScripts\Webscraping learning\Webscrape article.py”,第 27 行,在 p = article.find_all('div', class_='content-list-component yr-content-list-text text').p.text 文件 "C:\Users\Denze\AppData\Local\Programs\Python\Python39\lib\site-packages\bs4\element.py", 第 2173 行,在 getattr 中 raise AttributeError(AttributeError: ResultSet object has no attribute 'p'. 你可能将元素列表视为 单个元素。当你打算调用 find() 时,你调用了 find_all() 吗?

【问题讨论】:

  • 完整发布错误。虽然我怀疑这是因为您没有将.find_all() 的结果视为可迭代对象。
  • 好的,我已经在我的帖子中添加了错误消息,我很想知道为什么我会收到这个错误..
  • 是的,.find_all() 返回一个集合,您将其视为单个元素。事实上,这个错误在最后几句话中准确地告诉了你。
  • 刚开始编程,所以我仍然对所有术语的含义有些困惑,但感谢您的洞察力。

标签: html python-3.x beautifulsoup


【解决方案1】:

我正在使用 select 方法来获取所有段落元素。看看这段代码:

from bs4 import BeautifulSoup
import requests
import csv

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64)',
    }


url = "https://www.huffpost.com/entry/angry-squirrel-attacks-queens_n_5fee30b1c5b6ec8ae0b242d2"

response = requests.get(url, headers=headers).text

soup = BeautifulSoup(response, 'lxml')

h1=soup.find('h1')
article = soup.select('p')


print(h1.text+'\n')
for i in article:
  print(i.text)

【讨论】:

  • 很有趣,所以基本上 h1 变量使用 .find 方法抓取它看到的第一个 h1 标签。然后在soup上使用.select方法,它会抓取它看到的第一个'p'标签,然后for循环遍历文章中的每个'p'标签并打印它的文本? .find 和 .select 有什么区别。难道我不能使用 .find_all 方法来查找所有的“p”标签吗?
  • @JohnnySilverhand 更正:它抓取 all p 标签并循环遍历这些标签。此外,.find().find_all() 使用 BeautifulSoup 的搜索,而 .select() 使用 CSS 样式搜索。
猜你喜欢
  • 2015-06-26
  • 2021-10-17
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多