在python中抓取一个维基百科页面并将其存储在.csv文件中

时间:2016-08-27 08:18:28

标签: python beautifulsoup web-crawler

这是我的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”标签,但它不会以相同的方式发生!告诉我我的错误。

1 个答案:

答案 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")