Obecnie pracuję nad programem skrobakowym, który wejdzie na stronę Wikipedii, aw swojej obecnej formie, zeskrobuje referencje z strony.

Chciałbym mieć GUI, który pozwoli użytkownikowi wprowadzić stronę Wikipedii. Chcę, aby wejście było przymocowane do zmiennej selectWikiPage, ale nie miałem szczęścia jak daleko.

Poniżej znajduje się mój aktualny kod.

import requests
from bs4 import BeautifulSoup
import re
from tkinter import *

#begin tkinter gui
def show_entry_fields():
   print("Wikipedia URL: %s" % (e1.get()))
   e1.delete(0,END)
master = Tk()
Label(master, text="Wikipedia URL").grid(row=0)
e1 = Entry(master)
e1.insert(10,"http://en.wikipedia.org/wiki/randomness")
e1.grid(row=0, column=1)
Button(master, text='Scrape', command=master.quit).grid(row=3, column=0, sticky=W, pady=4)
mainloop( )

session = requests.Session()
selectWikiPage = input(print("Please enter the Wikipedia page you wish to scrape from"))
if "wikipedia" in selectWikiPage:
    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")

Z góry bardzo dziękuję.

13
Bocui 28 wrzesień 2017, 11:18

2 odpowiedzi

Najlepsza odpowiedź

Kod był prawie poprawny. Niewiele modyfikacji wystarczyło. Mam nadzieję że to pomoże. Proszę skomentować, jeśli potrzebujesz dalszych wyjaśnień.

    import requests
    from bs4 import BeautifulSoup
    import re
    from tkinter import *


    # you can declare selectWikiPage and master to be global and then avoid passing them around

    # begin tkinter gui
    def show_entry_fields():
        print("Wikipedia URL: %s" % (e1.get()))
        e1.delete(0, END)

    #utility which selects all the text from start to end in widget
    def select_all(event=None):
        event.widget.select_range(0, 'end')
        return 'break'


    #the code is same, just obtained the URL from the widget using get()

    def custom_scrape(e1, master):
        session = requests.Session()
        # selectWikiPage = input("Please enter the Wikipedia page you wish to scrape from")
        selectWikiPage = e1.get()
        if "wikipedia" in selectWikiPage:
            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")

        master.quit()


    master = Tk()
    Label(master, text="Wikipedia URL").grid(row=0)
    e1 = Entry(master)

    #bind ctrl+a for selecting all the contents of Entry widget
    e1.bind('<Control-a>', select_all)
    e1.insert(10, "Enter a wikipedia URL")
    e1.grid(row=0, column=1)

    #here, command attribute takes a lambda which itself doesnot take any args,
    #but in turn calls another function which accepts
    #arguments
    #Refer to: https://stackoverflow.com/questions/22723039/python-tkinter-passing-values-with-a-button for details

    Button(master, text='Scrape', command=lambda: custom_scrape(e1, master)).grid(row=3, column=0, sticky=W, pady=4)
    mainloop()
2
Deepayan Ghosh 25 październik 2017, 19:24

Oto drobny przykład na podstawie twojego kodu; Pozwala na użycie pola wprowadzania do przechwytywania wartości strony Wiki do odwiedzenia i drukuje go na konsoli.
Następnie możesz użyć tego adresu URL, aby kontynuować skrobanie.

from tkinter import *

def m_quit():
    global wiki_url
    wiki_url += e1.get() + '/'
    print('quitting')
    master.destroy()

wiki_url = 'http://en.wikipedia.org/wiki/'    

master = Tk()
Label(master, text="Wikipedia URL").grid(row=0)

e1 = Entry(master)
e1.grid(row=0, column=1)

Button(master, text='Scrape', command=m_quit).grid(row=3, column=0, sticky=W, pady=4)

mainloop()

print(wiki_url)
8
Reblochon Masque 28 wrzesień 2017, 08:30