Wie kann ich in Julia Web Scraping durchführen?

8

Ich möchte die Namen der Universitäten und ihrer Websites von dieser Website in Listen extrahieren .

In Python habe ich es mit BeautifulSoup v4 gemacht:

import requests
from bs4 import BeautifulSoup
import pandas as pd

page = requests.get('https://thebestschools.org/features/best-computer-science-programs-in-the-world/')
content = BeautifulSoup(page.text, 'html.parser')

college_name = []
college_link = []
college_name_list = content.find_all('h3',class_='college')
for college in college_name_list:
    if college.find('a'):
        college_name.append(college.find('a').text)
        college_link.append(college.find('a')['href'])

Ich programmiere sehr gerne in Julia und da es Python sehr ähnlich ist, wollte ich wissen, ob ich auch in Julia Web Scraping machen kann. Jede Hilfe wäre dankbar.

PseudoCodeNerd
quelle
1
Tipp: Fragen Sie niemals, welche Pakete vorhanden sind, um X beim Stapelüberlauf auszuführen. Fragen Sie immer nur, wie man X macht. Aus zwei Gründen: 1 Einkaufsfragen werden schnell geschlossen. 2 Erhalten Sie bessere Antworten zur Verwendung von Paket- oder Standardbibliotheksfunktionen.
Lyndon White
Wenn Sie sich selbst erkunden möchten, gehen Sie zu pkg.julialang.org und geben Sie 'html' in das Suchfeld ein. Auch 'xml'. Sie finden viele Pakete, mit denen Sie XML-ähnliche Dokumente durchsuchen können.
Tasos Papastylianou

Antworten:

4

Ihr Python-Code funktioniert nicht ganz. Ich denke, die Website wurde kürzlich aktualisiert. Da sie die Links entfernt haben, soweit ich das beurteilen kann. Hier ist ein ähnliches Beispiel mit Gumbo.jl und Cascadia.jl .

Ich verwende den eingebauten downloadBefehl, um die Webseite herunterzuladen. Das schreibt es auf die Festplatte in einer temporären Datei, die ich dann in String einlese. Es könnte sauberer sein, HTTP.jl zu verwenden , das es direkt in einen String einlesen könnte. Aber für dieses einfache Beispiel ist es in Ordnung

using Gumbo
using Cascadia

url = "https://thebestschools.org/features/best-computer-science-programs-in-the-world/"

page = parsehtml(read(download(url), String))


college_name = String[]
college_location = String[]


sections = eachmatch(sel"section", page.root)
for section in sections
    maybe_col_heading = eachmatch(sel"h3.college", section)
    if length(maybe_col_heading) == 0
        continue
    end
    col_heading = first(maybe_col_heading)

    name = strip(text(last(col_heading.children)))
    push!(college_name, name)

    loc = first(eachmatch(sel".school-location", section))
    push!(college_location, text(loc[1]))
end


[college_name college_location]

Ausgänge

julia> [college_name college_location]
51×2 Array{String,2}:
 "Massachusetts Institute of Technology (MIT)"  "Cambridge, Massachusetts"
 "Massachusetts Institute of Technology (MIT)"  "Cambridge, Massachusetts"
 "Stanford University"                          "Stanford, California"
 "Carnegie Mellon University"                   "Pittsburgh, Pennsylvania"
 

 "Shanghai Jiao Tong University"                "Shanghai, China"
 "Lomonosov Moscow State University"            "Moscow, Russia"
 "City University of Hong Kong"                 "Hong Kong"

Scheint, als wäre MIT zweimal gelistet. Wahrscheinlich ist der Filtercode in meiner Demo nicht ganz richtig. Aber: Achselzucken: MIT ist eine großartige Universität, die ich höre. Julia wurde dort erfunden: Freude:

Lyndon White
quelle
3

Ja.

Für das Web-Scraping verfügt Julia über drei Bibliotheken:

  • HTTP.jl zum Herunterladen des Frontend-Quellcodes der Website (vergleichbar mit der Python- requestsBibliothek),
  • Gumbo.jl , um den heruntergeladenen Quellcode in ein hierarchisch strukturiertes Objekt zu analysieren ,
  • und Cascadia.jl, um schließlich mithilfe einer CSS-Selektor-API zu kratzen .

Ich habe gesehen, dass Sie jung (16) aus Ihrem Profil sind und Ihre Python-Implementierung auch korrekt ist.

Daher würde ich Ihnen empfehlen, mit diesen drei Bibliotheken eine Web-Scraping-Aufgabe durchzuführen, um besser zu verstehen, wie sie funktionieren.

Die Aufgabe, die Sie leider ausführen möchten, kann mit Cascadia noch nicht ausgeführt werden, da sich das h3in einem <span>befindet, das derzeit kein in Cascadia.jl Source implementierter SelectorType ist

PseudoCodeNerd
quelle
1
Ich bin mir ziemlich sicher, dass Sie dies mit Cascadia tun können. Ich denke spanalleine funktioniert gut? Über CSS-Stilauswahl
Lyndon White
1
Erwähnenswert ist auch, dass man beautifulsoup selbst über die Python-Oberfläche in Julia verwenden kann.
Tasos Papastylianou
@tasos vielleicht eine separate Antwort geben, die zeigt, wie das geht?
Lyndon White
@LyndonWhite eh, ich bin sicher, es gibt schon genug schlechte Pycall-Beispiele in SO, ohne dass ich ein weiteres hinzufüge ...: p
Tasos Papastylianou