📜  如何在Python中提取维基百科数据?

📅  最后修改于: 2022-05-13 01:54:37.115000             🧑  作者: Mango

如何在Python中提取维基百科数据?

在本文中,我们将学习如何使用Python提取维基百科数据,这里我们使用两种方法来提取数据。

方法一:使用维基百科模块

在这种方法中,我们将使用 维基百科 用于提取数据的模块。维基百科是一个多语言在线百科全书,由志愿者编辑社区使用基于维基的编辑系统作为一个开放的协作项目创建和维护。

要安装,请在终端中运行此命令。

pip install wikipedia

维基百科数据,我们将在此处提取:-

  • 摘要、标题
  • 页面内容
  • 获取图片来源和页面网址列表
  • 不同类别

一一提取数据:

1.提取摘要和页面

Python3
import wikipedia
 
 
wikipedia.summary("Python (programming language)")


Python3
wikipedia.page("Python (programming language)").content


Python3
wikipedia.page("Python (programming language)").images


Python3
wikipedia.page('"Hello, World!" program').url


Python3
wikipedia.page('"Hello, World!" program').categories


Python3
wikipedia.page('"Hello, World!" program').links


Python3
wikipedia.set_lang("hi")
wikipedia.summary('"Hello, World!" program')


Python3
# Import Module
from bs4 import *
import requests
 
# Given URL
url = "https://en.wikipedia.org/wiki/Beautiful_Soup_(HTML_parser)"
 
# Fetch URL Content
r = requests.get(url)
 
# Get body content
soup = BeautifulSoup(r.text,'html.parser').select('body')[0]
 
# Initialize variable
paragraphs = []
images = []
link = []
heading = []
remaining_content = []
 
# Iterate throught all tags
for tag in soup.find_all():
     
    # Check each tag name
    # For Paragraph use p tag
    if tag.name=="p":
       
        # use text for fetch the content inside p tag
        paragraphs.append(tag.text)
         
    # For Image use img tag
    elif tag.name=="img":
       
        # Add url and Image source URL
        images.append(url+tag['src'])
         
    # For Anchor use a tag
    elif tag.name=="a":
       
        # convert into string and then check href
        # available in tag or not
        if "href" in str(tag):
           
          # In href, there might be possible url is not there
          # if url is not there
            if "https://en.wikipedia.org/w/" not in str(tag['href']):
                link.append(url+tag['href'])
            else:
                link.append(tag['href'])
                 
    # Similarly check for heading
    # Six types of heading are there (H1, H2, H3, H4, H5, H6)
    # check each tag and fetch text
    elif "h" in tag.name:
        if "h1"==tag.name:
            heading.append(tag.text)
        elif "h2"==tag.name:
            heading.append(tag.text)
        elif "h3"==tag.name:
            heading.append(tag.text)
        elif "h4"==tag.name:
            heading.append(tag.text)
        elif "h5"==tag.name:
            heading.append(tag.text)
        else:
            heading.append(tag.text)
             
    # Remain content will store here
    else:
        remaining_content.append(tag.text)
         
print(paragraphs, images, link, heading, remaining_content)


输出:

2. 页面内容:

为了提取文章的内容,我们将使用page()方法和content属性来获取实际数据。

蟒蛇3

wikipedia.page("Python (programming language)").content

输出:

3. 从维基百科中提取图像。

蟒蛇3

wikipedia.page("Python (programming language)").images

输出:

4. 提取当前页面 URL:

使用page()方法和url属性。

蟒蛇3

wikipedia.page('"Hello, World!" program').url

输出:

'https://en.wikipedia.org/wiki/%22Hello,_World!%22_program'

5. 获取文章分类列表。

使用page()方法和类别属性。

蟒蛇3

wikipedia.page('"Hello, World!" program').categories

输出:

['Articles with example code',
 'Articles with short description',
 'Commons category link is on Wikidata',
 'Computer programming folklore',
 'Short description is different from Wikidata',
 'Test items in computer languages',
 'Webarchive template wayback links']

6. 获取一篇文章的所有链接列表

蟒蛇3

wikipedia.page('"Hello, World!" program').links

输出:

7. 获取不同语言的数据。

现在我们将看到语言转换,为了转换成另一种语言,我们将使用set_lang()方法。

蟒蛇3

wikipedia.set_lang("hi")
wikipedia.summary('"Hello, World!" program')

输出:

方法二:使用请求 BeautifulSoup

在这种方法中,我们将使用 Web Scraping。

为了在Python中进行抓取,我们将使用两个模块:

  • bs4: Beautiful Soup(bs4) 是一个Python库,用于从 HTML 和 XML 文件中提取数据。这个模块没有内置于Python中。要安装此类型,请在终端中输入以下命令。
pip install bs4
  • 请求:请求允许您非常轻松地发送 HTTP/1.1 请求。这个模块也没有内置于Python中。要安装此类型,请在终端中输入以下命令。
pip install requests

数据将被提取:-

  • 段落
  • 图片
  • 图像列表
  • 标题
  • 不需要的内容(剩余内容)

方法:

  • 获取 HTML 代码
  • 从 HTML 代码中,获取body标签内的内容
  • 遍历正文内容并获取上述数据

下面是完整的实现:

蟒蛇3

# Import Module
from bs4 import *
import requests
 
# Given URL
url = "https://en.wikipedia.org/wiki/Beautiful_Soup_(HTML_parser)"
 
# Fetch URL Content
r = requests.get(url)
 
# Get body content
soup = BeautifulSoup(r.text,'html.parser').select('body')[0]
 
# Initialize variable
paragraphs = []
images = []
link = []
heading = []
remaining_content = []
 
# Iterate throught all tags
for tag in soup.find_all():
     
    # Check each tag name
    # For Paragraph use p tag
    if tag.name=="p":
       
        # use text for fetch the content inside p tag
        paragraphs.append(tag.text)
         
    # For Image use img tag
    elif tag.name=="img":
       
        # Add url and Image source URL
        images.append(url+tag['src'])
         
    # For Anchor use a tag
    elif tag.name=="a":
       
        # convert into string and then check href
        # available in tag or not
        if "href" in str(tag):
           
          # In href, there might be possible url is not there
          # if url is not there
            if "https://en.wikipedia.org/w/" not in str(tag['href']):
                link.append(url+tag['href'])
            else:
                link.append(tag['href'])
                 
    # Similarly check for heading
    # Six types of heading are there (H1, H2, H3, H4, H5, H6)
    # check each tag and fetch text
    elif "h" in tag.name:
        if "h1"==tag.name:
            heading.append(tag.text)
        elif "h2"==tag.name:
            heading.append(tag.text)
        elif "h3"==tag.name:
            heading.append(tag.text)
        elif "h4"==tag.name:
            heading.append(tag.text)
        elif "h5"==tag.name:
            heading.append(tag.text)
        else:
            heading.append(tag.text)
             
    # Remain content will store here
    else:
        remaining_content.append(tag.text)
         
print(paragraphs, images, link, heading, remaining_content)

例子: