Как очистить несколько таблиц одной страницы на странице википедии? - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь собрать все таблицы на следующей странице в одну большую таблицу;https://en.wikipedia.org/wiki/List_of_QI_episodes

Но проблема в том, что мой код только загружает таблицу Pilot и ничего другого.Я посмотрел на HTML и заметил, что все они имеют один и тот же класс, так как мне различать их.

Заранее спасибо.

import requests
import pandas as pd
from bs4 import BeautifulSoup
page = requests.get("https://en.wikipedia.org/wiki/List_of_QI_episodes")
soup = BeautifulSoup(page.content, "lxml")
My_table = soup.find("table",{"class":"wikitable plainrowheaders wikiepisodetable"})
print(My_table)

Ответы [ 4 ]

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

Вы также можете использовать панд read_html

import requests
import pandas as pd

url = 'https://en.wikipedia.org/wiki/List_of_QI_episodes'
re = requests.get(url, headers =  {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'})
df = pd.read_html(re.text)
print(df)
0 голосов
/ 16 февраля 2019

Если вы хотите настроить таргетинг на все таблицы, вы можете просто выбрать все таблицы, которые соответствуют вашим критериям select вернет все таблицы:

import requests
from bs4 import BeautifulSoup
page = requests.get("https://en.wikipedia.org/wiki/List_of_QI_episodes")
soup = BeautifulSoup(page.content, "lxml")
print(soup.select("table.wikitable.plainrowheaders.wikiepisodetable")

Если вы хотите настроить таргетинг на каждуюПо отдельности для таблицы можно использовать селектор :has() для нацеливания на заголовок перед таблицей, которая содержит конкретный требуемый id, а затем комбинатор +, который найдет следующего потомка.Вот простой пример, нацеленный на две таблицы.

import requests
from bs4 import BeautifulSoup
page = requests.get("https://en.wikipedia.org/wiki/List_of_QI_episodes")
soup = BeautifulSoup(page.content, "lxml")
for tid in ('Pilot', 'Series_A_\\.282003\\.29'):
    table = soup.select_one("h3:has(span#{}) + table.wikitable.plainrowheaders.wikiepisodetable".format(tid))
    print(table)

Вы можете расширить аналогичную логику, чтобы выбрать любую цель.

РЕДАКТИРОВАТЬ: используйте select_one во втором примере какмы нацелены на одну таблицу вместо многих таблиц.

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

Вместо поиска используйте find_all.find_all возвращает все узлы с соответствующими свойствами, тогда как find просто возвращает первый узел.

import requests
import pandas as pd
from bs4 import BeautifulSoup
page = requests.get("https://en.wikipedia.org/wiki/List_of_QI_episodes")
soup = BeautifulSoup(page.content, "lxml")
my_tables = soup.find_all("table",{"class":"wikitable plainrowheaders wikiepisodetable"})
for table in my_tables:
    print(table)

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

Попробуйте вместо этого использовать find_all, обратите внимание, что это вернет список узлов вместо одного узла.

...