доступ к подстолбцу другого столбца из таблицы википедии с помощью Beautifulsoup

У меня есть проект, который требует, чтобы мы загрузили и прочитали таблицу из Википедии и использовали эту информацию для расчетов. Страница википедии: https://en.wikipedia.org_wiki_mec_me_data_crypt_subscribe.com/Listrate_of_crime_subscribe

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

Я просмотрел Интернет, и я нашел много вариантов здесь и на других веб-сайтах, но они действительно не помогают в этом конкретном случае. Но вот код, который у меня есть в настоящее время, который может принимать все значения из таблицы. большинство переменных являются держателями, пока я тестирую, потому что я занимался этим несколько дней

state = soup.find_all('th', limit = 7)
for row in state:
    row_data = row.get_text(strip = True, separator = '|').split('|')[0:1]
    outfile.write(str(row_data)+ "\n")
umber = soup.find_all('td')

for column in number:
     column_data = column.get_text(strip = True, separator = '|').split('|')[0:1]

     outfile.write(str(column_data)+ "\n")

Я в основном хочу сохранить эту информацию в виде списка для последующего использования, а затем использовать ссылки на каждый город и получить их шнуры, а затем сослаться на несколько городов в Техасе для ближайшего к границе

Нам разрешено использовать только BeautifulSoup и CSV, без Pandas или NumPy.

Изменить: функции записи также предназначены только для тестирования. Это только для того, чтобы увидеть, правильно ли он захватывает информацию из таблицы. Моя консоль IDE не может отображать их все, поэтому записать это было следующим лучшим, что я мог придумать.


person Gary    schedule 31.01.2019    source источник


Ответы (1)


Похоже, это просто проблема создания ваших списков. Вы можете сделать это, инициализировав свой список, а затем добавив к нему свой список. Или вы можете добавить к нему каждый из элементов цикла for. Или вы можете сделать это более кратким, выполнив понимание списка.

Причина, по которой вы ничего не получаете обратно, заключается в том, что вы продолжаете перезаписывать свои row_data и column_data в цикле. И он будет записывать в файл, однако он будет помещать новую строку после каждого, когда я предполагаю, что вы хотите записать всю строку, а затем сделать новую строку, поэтому я бы также поместил вашу запись после того, как список создан / завершен:

Объединение списка в список:

row_data = []
for row in state:
    row_data = row_data + row.get_text(strip = True, separator = '|').split('|')[0:1]
outfile.write(str(row_data)+ "\n")


number = soup.find_all('td')

column_data = []
for column in number:
     column_data = column_data + column.get_text(strip = True, separator = '|').split('|')[0:1]
outfile.write(str(column_data)+ "\n")

Добавление элемента / элемента в список:

# Initiate and then append to a list
row_data = []
for row in state:
    row_data.append(row.text)
outfile.write(str(row_data)+ "\n")


number = soup.find_all('td')
column_data = []
for column in number:
     column_data.append(column.text)
outfile.write(str(column_data)+ "\n")

Понимание списка:

#List comprehension
row_data = [ row.text for row in state ]
outfile.write(str(row_data)+ "\n")

column_data = [ column.text for column in number ] 
outfile.write(str(column_data)+ "\n")

Что касается получения этих подстолбцов, это сложно, потому что это не дочерние теги. Однако они являются следующим тегом <tr> после тега ‹th>, который вы извлекаете, поэтому мы могли бы его использовать.

import bs4
import requests
import csv



url = 'https://en.wikipedia.org/wiki/List_of_United_States_cities_by_crime_rate#Criticism_of_ranking_crime_data'

response = requests.get(url)

soup = bs4.BeautifulSoup(response.text, 'html.parser')

# Only want State and City so limit = 2
headers = soup.find_all('th', limit = 2)
sub_headers = headers[0].findNext('tr')


# Initiate and then append to a list
header_data = []
for data in headers:
    header_data.append(data.text.strip())


sub_header_data = []
for data in sub_headers.find_all('th'):
    sub_header_data.append(data.text.strip())

# Only want to append the first Total column from the sub_headers    
header_data.append(sub_header_data[0])


with open('C:/test.csv', mode='w', newline='') as outfile:
    writer = csv.writer(outfile)
    writer.writerow(header_data)



    table_body = soup.find_all('tbody')[1]
    rows = table_body.find_all('tr')
    for row in rows:
        tds = row.find_all('td', limit = 4)

        #Skip the blank rows of data
        if tds == []:
            continue

        tds_data = []
        for data in tds:
            tds_data.append(data.text.strip())

        #Remove the Population number/data
        del tds_data[2]

        writer.writerow(tds_data)
person chitown88    schedule 31.01.2019
comment
запись - это всего лишь «тест». Я не могу видеть все «скопированные» данные в моем ide, поэтому я записал их в текстовый файл, чтобы посмотреть, что я получаю. но я попробую это и посмотрю, сработает ли это - person Gary; 31.01.2019
comment
Ах хорошо. понял тебя. тогда я, просто отрегулируйте эту часть. Но другая часть должна поместить эти данные в список, чтобы вы затем написали - person chitown88; 31.01.2019
comment
я только что попробовал. Дело в том, что мне нужна только колонка информации от Total, City и State. Я знаю, что у супа есть родственные и родительские функции. могут ли они определить, принадлежат ли они к первому столбцу диапазона столбцов 5? потому что это сколько один включает в себя 5 подкатегорий - person Gary; 31.01.2019
comment
Значит, вам просто нужны Штат, Город и Итого? - person chitown88; 31.01.2019
comment
да в основном и всего только для всего насильственного преступления - person Gary; 31.01.2019
comment
Да, вам придется немного поработать с этими столбцами, поскольку они охватывают несколько столбцов. Делает это немного сложнее, но это возможно. - person chitown88; 31.01.2019
comment
дело в том, что я не знаю, как добраться до этого конкретного столбца в целом, не взяв все - person Gary; 01.02.2019
comment
поэтому просто просканировал всю таблицу и взял только определенные итерации из таблицы в другую таблицу (что ужасно, но я проверю это: D - person Gary; 04.02.2019