Вопрос по beautifulsoup, python – Python Beautifulsoup итерации по таблице

12

Я пытаюсь собрать данные таблицы в файл CSV. К сожалению, я столкнулся с дорожным препятствием, и следующий код просто повторяет TD из первого TR для всех последующих TR.

<code>import urllib.request
from bs4 import BeautifulSoup

f = open('out.txt','w')

url = "http://www.international.gc.ca/about-a_propos/atip-aiprp/reports-rapports/2012/02-atip_aiprp.aspx"
page = urllib.request.urlopen(url)

soup = BeautifulSoup(page)

soup.unicode

table1 = soup.find("table", border=1)
table2 = soup.find('tbody')
table3 = soup.find_all('tr')

for td in table3:
    rn = soup.find_all("td")[0].get_text()
    sr = soup.find_all("td")[1].get_text()
    d = soup.find_all("td")[2].get_text()
    n = soup.find_all("td")[3].get_text()

    print(rn + "," + sr + "," + d + ",", file=f)
</code>

Это мой первый скрипт на Python, поэтому любая помощь будет принята с благодарностью! Я просмотрел ответы на другие вопросы, но не могу понять, что я делаю здесь неправильно.

Ваш Ответ

2   ответа
6

что каждый раз, когда вы пытаетесь сузить свой поиск (получить первое значение в этом списке и т. Д.), Вы вместо этого просто перезваниваете супу. Суп - это объект верхнего уровня - он представляет весь документ. Вам нужно только вызвать суп один раз, а затем использовать результат этого вместо супа для следующего шага.

Например (с измененными именами переменных, чтобы быть более понятным),

table = soup.find('table', border=1)
rows = table.find_all('tr')

for row in rows:
    data = row.find_all("td")
    rn = data[0].get_text()
    sr = data[1].get_text()
    d = data[2].get_text()
    n = data[3].get_text()

    print(rn + "," + sr + "," + d + ",", file=f)

Я не уверен, что оператор print - лучший способ сделать то, что вы пытаетесь сделать здесь (по крайней мере, вы должны использовать форматирование строк вместо добавления), но я оставляю его как есть, потому что он не основная проблема.

Также для завершения:soup.unicode не буду ничего делать. Вы не вызываете метод там, и нет назначения. Я не помню, чтобы у BeautifulSoup был метод с именем unicode, но я привык к BS 3.0, поэтому он может быть новым в 4.

35

find() или жеfind_all()поэтому, когда вы запрашиваете, например, все теги "td", вы получаете все теги "td" тегиin the document, не только те в таблице и строке, которую вы искали. Вы также можете не искать их, потому что они не используются так, как написан ваш код.

Я думаю, что вы хотите сделать что-то вроде этого:

table1 = soup.find("table", border=1)
table2 = table1.find('tbody')
table3 = table2.find_all('tr')

Или, вы знаете, что-то вроде этого, с более описательными именами переменных для загрузки:

rows = soup.find("table", border=1).find("tbody").find_all("tr")

for row in rows:
    cells = row.find_all("td")
    rn = cells[0].get_text()
    # and so on

Похожие вопросы