Написание / печать содержимого таблицы для многостраничного стола - PullRequest
0 голосов
/ 19 сентября 2019

Я хочу прочитать таблицу заключенных в тюрьме http://www.showmeboone.com/sheriff/jailresidents/

И распечатать каждую запись в каждой строке, разделенную столбцом (для последующей записи в CSV).

Я хочу получить имя, город, возраст и т. Д., А затем ссылку href на кнопку «детали».

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

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

soup = bs.BeautifulSoup(source,'lxml')

table = soup.table
table = soup.find('table')
table_rows = table.find_all('tr') 

for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    for i in row:
        print(i, end=",")

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

https://imgur.com/a/x55Iama

1 Ответ

0 голосов
/ 20 сентября 2019

У вас есть несколько проблем в игре здесь.

Для начала вы, кажется, нажали не тот URL.Во-вторых, вам нужно установить User-Agent в вашем запросе - в противном случае этот сайт вообще не возвращает никаких данных и код состояния 500. В-третьих: на этой странице 14 таблиц.Вам нужно выбрать правильный.

Я предлагаю начать так:

# when I hit the url given by you it redirects to the one below
import requests
from bs4 import BeautifulSoup

# you can set the number of rows to be returned with a max_rows-paramter
url = 'https://report.boonecountymo.org/mrcjava/servlet/SH01_MP.I00290s?max_rows=1000'

# set user-agent
header = {'User-Agent': 'Mozilla Firefox 50.0'}

# collect data
r = requests.get(url, headers=header)
soup = BeautifulSoup(r.text, 'lxml')

# so do some inspection with the dev tools
# the table you need is has these classes
# "collapse data-table shadow responsive"
# use css-selector to grab that one particular table
table = soup.select_one('table.collapse.data-table.shadow.responsive')
table_rows = table.find_all('tr')
# continue extracting data....

Так что первые 3 строки не содержат данных.Интересующие вас данные на самом деле напоминают словари, так как имеют атрибут ('data-sh'), который содержит ключ для содержимого в тд.Это верно для всех тдс, кроме того, который содержит href.Для этого тд атрибут == "".Таким образом, простая логика для извлечения данных будет выглядеть примерно так:

base_url = "https://report.boonecountymo.org/mrcjava/servlet/"
user_list = []
for row in table_rows[3:]:
    tds = row.find_all('td')
    user_dict = {}
    for td in tds:
        key = td.get('data-th')
        value = td.get_text().strip()
        # if key == "", the td contains the href
        if key == "":
            key = "link"
            value = base_url + td.find('a').get('href')

        user_dict[key] = value
    user_list.append(user_dict)

Это даст список диктов, содержащих все необходимые данные.Экспортировать Dicts легко, используя CSV-модуль или используя панд

Если ваш выбор - это pandas, вам нужно только сделать это:

import pandas as pd
df = pd.DataFrame(user_list)
df.to_excel("outfile.xlsx", encoding="utf-8", index=False)

Надеюсь, что это поможет вам в дальнейшем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...