我试图将下一页的所有表格划分为一个大表; 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)
请尝试使用find_all,注意这将返回节点列表而不是仅返回一个节点。
如果要定位所有表,只需选择符合条件的所有表,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
,因为我们的目标是与许多表相对的单个表。
而不是找到使用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)
您也可以使用pandas 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)