这是我的python脚本代码
from bs4 import BeautifulSoup
import requests
url='https://en.wikipedia.org/wiki/List_of_Pok%C3%A9mon'
source_code=requests.get(url)
print(url)
plain_text=source_code.text
soup=BeautifulSoup(plain_text,"html.parser")
print("hello")
f = open('pokemons.csv', 'w')
for table2 in soup.findAll('table'):
print("yash")
for i in table2.findAll('tbody'):
print("here")
for link in i.findAll('tr'):
for x in link.findAll('td'):
for y in x.findAll('a'):
z=y.get('href')
print(z)
#f.write(link)
f.close()
我想要做的就是从这个wiki链接抓取所有的小宠物名称 https://en.wikipedia.org/wiki/List_of_Pok%C3%A9mon 但这里的问题是我无法进入指定的表格i。所有小宠物名称都存储在其中的表格,但我上面的代码即时通过表格并尝试访问“tbody”标签,以便我可以访问其中的“tr”标签,但它不会以相同的方式发生!告诉我我的错误。
答案 0 :(得分:1)
tbody 是由浏览器添加的,因此不在请求返回的实际源中,因此您的代码永远无法找到使用它的任何内容。
您需要做的就是在每一行中使用 title 属性获取每个锚点:
with open('pokemons.csv', 'w') as f:
table = soup.select_one("table.wikitable.sortable")
for a in table.select("tr td a[title]"):
f.write(a.text.encode("utf-8") + "\n")
这会给你761个名字,每行一个。
如果你使用find_all并找到,那就像是:
# get all orws
for tr in table.find_all("tr"):
# see if there is an anchor inside with a title attribute
a = tr.find("a", title=True)
# if there is write the text
if a:
f.write(tr.find("a", title=True).text.encode("utf-8") + "\n")