如何使用 Python 爬取段落?


可以使用 Python 的 Beautiful Soup 库来爬取段落。BeautifulSoup 是一个 Python 库,可以轻松解析 HTML 和 XML 文档。它提供了一种方便的方式来浏览和搜索已解析的数据,使其成为 Web 爬取任务的理想选择。通过利用其强大的功能,我们可以从网页中提取特定的元素,例如段落。在这篇文章中,我们将使用 Python 的 Beautiful Soup 库来爬取段落。

安装所需的库

在爬取段落之前,我们需要安装必要的库。打开您的终端或命令提示符,并运行以下命令来安装 BeautifulSoup 和 requests(一个用于发出 HTTP 请求的库)

pip install beautifulsoup4 requests

从网站爬取段落

我们将从 openAI 网站开始爬取段落。我们将使用 requests 库来获取页面的 HTML 内容,然后使用 BeautifulSoup 来解析和提取所需的段落。

算法

  • 导入必要的库:requests 和 BeautifulSoup。

  • 定义您要爬取的网站的 URL。

  • 使用 requests.get() 函数向网站发送 GET 请求并存储响应。

  • 使用 BeautifulSoup 通过创建具有响应文本和指定为“html.parser”的解析器类型的 BeautifulSoup 对象来解析 HTML 内容。

  • 使用 BeautifulSoup 对象的 find_all() 方法找到页面上的所有段落元素,并将“p”作为参数传递。

  • 遍历段落并使用 text 属性打印其文本。

示例

import requests
from bs4 import BeautifulSoup

# URL of the website to scrape
url = "https://openai.com/"

# Send a GET request to the website
response = requests.get(url)

# Parse the HTML content using BeautifulSoup
soup = BeautifulSoup(response.text, "html.parser")

# Find all the paragraph elements
paragraphs = soup.find_all("p")

# Iterate over the paragraphs and print their text
for paragraph in paragraphs:
    print(paragraph.text)

输出

Our work to create safe and beneficial AI requires a deep understanding of the potential risks and benefits, as well as careful consideration of the impact.
We research generative models and how to align them with human values.
Our API platform offers our latest models and guides for safety best practices.
Developing safe and beneficial AI requires people from a wide range of disciplines and backgrounds.
I encourage my team to keep learning. Ideas in different topics or fields can often inspire new ideas and broaden the potential solution space.

处理不同的 HTML 结构

网页可能有不同的 HTML 结构,段落可能位于各种标签或类属性内。为了处理这种情况,我们可以相应地修改我们的代码。

示例

让我们考虑一个段落包含在具有特定类的 <div> 标签中的示例。在这个例子中,我们在 html 变量中定义了一个 HTML 结构。我们通过传递 HTML 内容并指定解析器为“html.parser”来创建一个 BeautifulSoup 对象 soup。然后我们使用 soup.find() 定位具有类名“content”的父元素。接下来,我们使用 find_all() 查找父元素中的所有段落元素。

最后,我们遍历段落并打印它们的文本。

from bs4 import BeautifulSoup

html = '''
<html>
  <body>
    <div class="content">
      <h1>Website Title</h1>
      <p>This is the first paragraph.</p>
      <div class="inner-div">
        <p>This is the second paragraph.</p>
      </div>
      <p>This is the third paragraph.</p>
    </div>
  </body>
</html>
'''

soup = BeautifulSoup(html, "html.parser")

# Find the parent element containing the paragraphs
parent_element = soup.find("div", class_="content")

# Find all the paragraph elements within the parent element
paragraphs = parent_element.find_all("p")

for paragraph in paragraphs:
    print(paragraph.text)

输出

This is the first paragraph.
This is the second paragraph.
This is the third paragraph.

处理嵌套元素

有时,网页中的段落可能包含嵌套元素,例如链接、图像或跨度。如果我们只想提取段落的纯文本,我们可以使用 BeautifulSoup 提供的 get_text() 方法。

示例

让我们考虑一个例子,在这个例子中,我们在代码本身中定义了一个 HTML 结构,我们需要提取包含链接等嵌套元素的段落。

在下面的示例中,我们在 HTML 变量中定义了一个 HTML 结构。我们通过传递 HTML 内容并指定解析器为“html.parser”来创建一个 BeautifulSoup 对象 soup。然后我们使用 soup.find() 定位具有类名“content”的父元素。接下来,我们使用 find_all() 查找父元素中的所有段落元素。

对于每个段落,我们使用 get_text() 仅提取纯文本,不包括任何嵌套元素(如链接)。最后,我们打印提取的文本。

from bs4 import BeautifulSoup

html = '''
<html>
  <body>
    <div class="content">
      <h1>Website Title</h1>
      <p>This is the first paragraph.</p>
      <p>This is the second paragraph with a <a href="https://example.com">link</a> in it.</p>
      <p>This is the third paragraph.</p>
    </div>
  </body>
</html>
'''

soup = BeautifulSoup(html, "html.parser")

# Find the parent element containing the paragraphs
parent_element = soup.find("div", class_="content")

# Find all the paragraph elements within the parent element
paragraphs = parent_element.find_all("p")

for paragraph in paragraphs:
    # Extract only the plain text, excluding any nested elements
    text = paragraph.get_text()
    print(text)

输出

This is the first paragraph.
This is the second paragraph with a link in it.
This is the third paragraph.

结论

在本文中,我们讨论了如何在不同情况下使用 Python 从 HTML 页面中抓取段落。我们还探讨了在从 HTML 提取段落时处理不同的 HTML 结构和处理嵌套元素的情况。现在我们可以应用 Web 抓取技术来收集来自网站的有价值信息,用于分析、研究或其他目的。

更新于:2023年10月13日

720 次浏览

开启您的职业生涯

完成课程获得认证

开始学习
广告