Làm thế nào tôi có thể làm web cạo ở Julia?


8

Tôi muốn trích xuất tên của các trường đại học và trang web của họ từ trang web này vào danh sách.

Trong Python tôi đã làm điều đó với BeautifulSoup v4:

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'])

Tôi thực sự thích lập trình ở Julia và vì nó rất giống với Python, tôi muốn biết liệu tôi có thể thực hiện quét web ở Julia không. Bất kỳ trợ giúp sẽ được đánh giá cao.


1
Mẹo: Không bao giờ hỏi gói nào tồn tại để thực hiện X khi tràn ngăn xếp. Luôn luôn chỉ hỏi làm thế nào để làm X. Vì hai lý do: 1 câu hỏi mua sắm nhanh chóng bị đóng cửa. 2 nhận được câu trả lời tốt hơn cho thấy cách sử dụng gói hoặc chức năng thư viện tiêu chuẩn.
Lyndon White

Nếu bạn muốn tự khám phá, hãy truy cập pkg.julialang.org và nhập 'html' vào trường tìm kiếm. Ngoài ra 'xml'. Bạn sẽ tìm thấy nhiều gói cho phép bạn khám phá các tài liệu giống như xml.
TASos Papastylianou

Câu trả lời:


4

Mã python của bạn không hoạt động khá. Tôi đoán trang web đã được cập nhật gần đây. Vì họ đã loại bỏ các liên kết xa như tôi có thể nói ,. Đây là một ví dụ tương tự bằng cách sử dụng Gumbo.jlCascadia.jl .

Tôi đang sử dụng downloadlệnh tích hợp để tải xuống trang web. ghi nó vào đĩa trong một tệp tạm thời, sau đó tôi đọc vào Chuỗi. Có thể sạch hơn khi sử dụng HTTP.jl , có thể đọc thẳng vào Chuỗi. Nhưng với ví dụ đơn giản này, nó ổn

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]

Đầu ra

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"

Có vẻ như nó đã liệt kê MIT hai lần. có lẽ mã lọc trong bản demo của tôi không yên tĩnh. Nhưng: nhún vai: MIT là một trường đại học tuyệt vời mà tôi nghe thấy. Julia được phát minh ở đó: niềm vui:


3

Đúng.

Với mục đích quét web, Julia có ba thư viện:

  • HTTP.jl để tải xuống mã nguồn frontend của trang web (cái này có thể so sánh với requeststhư viện của python ),
  • Gumbo.jl để phân tích mã nguồn đã tải xuống thành một đối tượng có cấu trúc phân cấp,
  • Cascadia.jl để cuối cùng cạo bằng API bộ chọn CSS.

Tôi thấy rằng bạn còn trẻ (16) từ hồ sơ của bạn và việc thực hiện trăn của bạn cũng đúng.

Do đó, tôi khuyên bạn nên thử thực hiện một tác vụ quét web với ba thư viện này để hiểu rõ hơn về cách chúng hoạt động.

Nhiệm vụ mà bạn muốn làm, không may, không thể chưa thực hiện với Cascadia kể từ khi h3đang ở trong một <span>mà hiện nay không phải là một SelectorType thực hiện trong Cascadia.jl
Nguồn


1
Khá chắc chắn rằng bạn có thể làm điều này với Cascadia. Tôi nghĩ rằng spannó hoạt động tốt? Thông qua bộ chọn kiểu CSS
Lyndon White

1
Cũng đáng để chỉ ra rằng người ta có thể sử dụng beautifulsoup thông qua giao diện python trong julia.
TASos Papastylianou

@tasos có thể đưa ra một câu trả lời riêng biệt cho thấy làm thế nào để làm điều đó?
Lyndon White

@LyndonWhite eh, tôi chắc chắn đã có đủ các ví dụ pycall xấu trong SO mà không cần tôi thêm một ví dụ khác ...: p
Tasos Papastylianou
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.