【问题标题】:Scraping the links from an isolated part of a Wikipedia article从维基百科文章的孤立部分抓取链接
【发布时间】:2018-04-16 03:13:18
【问题描述】:

所以我尝试创建一个刮板,用于隔离页面的引用部分,然后从该网页中抓取标题和第一段或类似内容。 目前,我已经做到了,所以它可以隔离参考页面,但我不确定在“进入”其他链接方面如何取得进展。

这是我目前的代码

def customScrape(e1, master):
    session = requests.Session()
    # selectWikiPage = input("Please enter the Wikipedia page you wish to scrape from")
    selectWikiPage = e1.get()
    if "wikipedia" in selectWikiPage: #turn this into a re
        html = session.post(selectWikiPage)
        bsObj = BeautifulSoup(html.text, "html.parser")
        findReferences = bsObj.find('ol', {'class': 'references'})  # isolate refereces section of page
        href = BeautifulSoup(str(findReferences), "html.parser")
        links = [a["href"] for a in href.find_all("a", href=True)]
        for link in links:
            print("Link: " + link)
    else:
        print("Error: Please enter a valid Wikipedia URL")

【问题讨论】:

  • 我不明白你的问题,你为什么不把你选择的链接保存在一个数组中,然后用类似的方法来处理它们,然后搜索你想要的东西?
  • 嗯,要怎么做呢? @SeeuD1
  • 您只需要创建一个类似 GetContents(Links) 的方法,在其中将您的链接作为参数,您可以在链接中创建一个 for Link:您可以在其中迭代列表并请求每个链接并将您从中保留的数据保存在另一个数组中,您可以在其中使用您选择的数据。这只是一种方法,你也可以做一个递归方法或类似的方法
  • 您想输入位于参考部分的链接吗?或第一个维基百科页面中的任何链接?请注意,参考部分中的大多数链接都托管在维基百科以外的其他地方!
  • 我知道这并不能回答您提出的直接问题,但其他人可能会觉得它很有用...如果您需要使用维基百科作为结构数据,请查看相关项目: wikidata.org/wiki/Wikidata:Main_Page - 这提供了维基百科大部分内容的结构化数据视图,包括主题之间的链接,并且可以在没有互联网连接延迟的情况下完整下载以进行分析。

标签: python python-3.x web-scraping beautifulsoup wikipedia


【解决方案1】:

在您的 customScrape 函数中,您可以对每个链接执行此操作:

ref_html = requests.get(link).text

link 获取完整文本(您不需要Session,除非您想在后续请求之间保存cookie 和其他内容)。 然后,您可以将 ref_html 解析为 find 标题或第一个标题或您喜欢的任何内容。

您的函数可能如下所示:

import requests, requests.exceptions
from bs4 import BeautifulSoup


def custom_scrape(wikipedia_url):
    wikipedia_html = requests.get(wikipedia_url).text
    refs = BeautifulSoup(wikipedia_html, 'html.parser').find('ol', {
        'class': 'references'
    })
    refs = refs.select('a["class"]')

    for ref in refs:
        try:
            ref_html = requests.get(ref['href']).text
            title = heading = BeautifulSoup(ref_html, 'html.parser')

            title = title.select('title')
            title = title[0].text if title else ''

            heading = heading.select('h1')
            heading = heading[0].text if heading else ''
        except requests.exceptions.RequestException as e:
            print(ref['href'], e)  # some refs may contain invalid urls
            title = heading = ''

        yield title.strip(), heading.strip()  # strip whitespace

然后您可以查看结果:

for title, heading in custom_scrape('https://en.wikipedia.org/wiki/Stack_Overflow'):
    print(title, heading)

【讨论】:

    猜你喜欢
    • 2020-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 2015-06-25
    相关资源
    最近更新 更多