Перебирая вики, используя "tr" и "td" с BeautifulSoup и python - PullRequest
0 голосов
/ 15 февраля 2019

Всего начинающих на Python3 здесь.Кажется, я не могу распечатать только название колледжа.класс не рядом с названиями колледжей, и я не могу сузить find_all до того, что мне нужно.и распечатать в новый CSV-файл.Есть идеи?

import requests
from bs4 import BeautifulSoup
import csv


res= requests.get("https://en.wikipedia.org/wiki/Ivy_League")
soup = BeautifulSoup(res.text, "html.parser")
colleges = soup.find_all("table", class_ = "wikitable sortable")

for college in colleges:
    first_level = college.find_all("tr")
    print(first_level)

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Вы можете использовать soup.select(), чтобы использовать селекторы CSS и быть более точным:

import requests
from bs4 import BeautifulSoup

res= requests.get("https://en.wikipedia.org/wiki/Ivy_League")
soup = BeautifulSoup(res.text, "html.parser")

l = soup.select(".mw-parser-output > table:nth-of-type(2) > tbody > tr > td:nth-of-type(1) a")
for each in l:
    print(each.text)

Печатный результат:

Brown University
Columbia University
Cornell University
Dartmouth College
Harvard University
University of Pennsylvania
Princeton University
Yale University

Чтобы поместить один столбец в CSV:

import pandas as pd
pd.DataFrame([e.text for e in l]).to_csv("your_csv.csv") # This will include index
0 голосов
/ 15 февраля 2019

С:

colleges = soup.find_all("table", class_ = "wikitable sortable")

вы получаете все таблицы с этим классом (их пять), а не все колледжи в таблице.Таким образом, вы можете сделать что-то вроде этого:

import requests
from bs4 import BeautifulSoup

res= requests.get("https://en.wikipedia.org/wiki/Ivy_League")
soup = BeautifulSoup(res.text, "html.parser")

college_table = soup.find("table", class_ = "wikitable sortable")
colleges = college_table.find_all("tr")

for college in colleges:
    college_row = college.find('td')
    college_link = college.find('a')
    if college_link != None:
        college_name = college_link.text
        print(college_name)

РЕДАКТИРОВАТЬ: Я добавил if, чтобы отменить первую строку, которая имеет заголовок таблицы

...