Python 使用BeautifulSoup解析列并另存为JSON

Python 使用BeautifulSoup解析列并另存为JSON,python,html,json,beautifulsoup,bs4,Python,Html,Json,Beautifulsoup,Bs4,我想解析网站上的Afk、Aantal和Zetels列:我最终可以将它们保存为JSON文件 在将其保存为json文件之前,我需要解析元素 我有 我试过 from bs4 import BeautifulSoup import urllib jaren = [str("2010"), str("2012")] for Jaargetal in jaren: r = urllib.urlopen("http://www.nlverkiezingen.com/TK" + Jaargetal

我想解析网站上的Afk、Aantal和Zetels列:我最终可以将它们保存为JSON文件

在将其保存为json文件之前,我需要解析元素

我有

我试过

from bs4 import BeautifulSoup
import urllib

jaren = [str("2010"), str("2012")]

for Jaargetal in jaren:
    r = urllib.urlopen("http://www.nlverkiezingen.com/TK" + Jaargetal +".html").read()
    soup = BeautifulSoup(r, "html.parser")
    tables = soup.find_all("table")

    for table in tables:
        header = soup.find_all("h1")[0].getText()
        print header

        for tr in  table.find_all("tr"):
            firstTd = tr.find("td")
            if firstTd and firstTd.has_attr("class") and "l" in firstTd['class']:
                tds = tr.find_all("td")

                for tr in table.find_all("tr"): 
                    print "|".join([x.get_text().replace('\n','') for x in tr.find_all('td')])
                    break

我做错了什么,或者我必须做什么,我在正确的轨道上吗?

只提取所需列的一个选项是检查列的索引。定义您感兴趣的列索引:

DESIRED_COLUMNS = {1, 2, 5}  # it is a set
然后与
find_all()
一起使用:


只提取所需列的一个选项是检查列的索引。定义您感兴趣的列索引:

DESIRED_COLUMNS = {1, 2, 5}  # it is a set
然后与
find_all()
一起使用:


你能指出现有代码到底有什么问题吗?谢谢。@alecxe在第一个代码中,它会打印所有行:Partij | Afk。| Aantal |%|+/-| Zetels我希望代码只打印行:Afk。安塔尔和泽特尔。你能指出现有代码到底出了什么问题吗?谢谢。@alecxe在第一个代码中,它会打印所有行:Partij | Afk。| Aantal |%|+/-| Zetels我希望代码只打印行:Afk。Aantal和Zetels。谢谢@Alecxe还有一个选项,我可以定义一些东西,仅从afk、Aantal和Zetels获取前3行,例如?@Danisk您可以随时切片,例如:
tr.find_all('td')[:3]
谢谢您的帮助!我还有一个简短的问题;这现在起作用了,唯一的一件事是我从2012年和2010年开始刮。2010年比2012年有更多的les行,所以它也刮去了我不想要的内容。有没有选择说。“网站2010中的tr.find_all td[:20]和tr.find_all('tr')[:19]从…起2012@Danisk抱歉之前的评论。我的意思是,你不应该试图限制你提取的行的数量-这是动态部分。感谢@Alecxe还有一个选项,我可以定义一些东西,例如仅从afk、Aantal和Zetels获取前3行吗?@Danisk你可以随时切片,例如:
tr.find\u all('td')[:3]
谢谢你的帮助!我还有一个简短的问题;现在这个问题可以解决了,唯一的问题是我正在从2012年和2010年抓取。2010年比2012年有更多的les行,所以它也会抓取我不想要的内容。有没有选择说:“2010年网站上的tr.find_all td[:20]和tr.find_all('tr')[:19]从…起2012@Danisk很抱歉前面的评论。我的意思是,你不应该试图限制你提取的行数-这是动态部分。
"|".join([x.get_text().replace('\n', '') 
          for index, x in enumerate(tr.find_all('td')) 
          if index in DESIRED_COLUMNS])