如何在Wikipedia页面中抓取一页的多个表?

时间:2019-02-16 01:10:51

标签: python web-scraping beautifulsoup html-parsing

我正在尝试将下一页的所有表都刮成一张大表; 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 :(得分:2)

请改用find_all,请注意,这将返回节点列表,而不只是一个节点。

答案 1 :(得分:2)

如果要定位所有表,则只需选择符合条件的所有表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的表之前定位标头,然后是{{1} }组合器,它将找到下一个子级。这是一个针对两个表的简单示例。

+

您可以扩展类似的逻辑以针对您想要的任何东西。

编辑:在第二个示例中使用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) ,因为我们的目标是与许多表相对的单个表。

答案 2 :(得分:0)

代替find使用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)

答案 3 :(得分:0)

您还可以使用熊猫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)