BeautifulSoup - скрести стол без класса - PullRequest
1 голос
/ 13 апреля 2020

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

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

Я новичок в просмотре веб-страниц / BeautifulSoup и буду признателен за любую помощь, которую смогу получить.

http://zipatlas.com/us/pa/philadelphia/zip-code-comparison/median-household-income.htm

from bs4 import BeautifulSoup
import requests

income_url = "http://zipatlas.com/us/pa/philadelphia/zip-code-comparison/median-household-income.htm"
headers = {"User-Agent": "Mozilla/5.0"}

response = requests.get(income_url,headers = headers)
response.status_code

soup = BeautifulSoup(response.content,"html.parser")

Ответы [ 3 ]

2 голосов
/ 13 апреля 2020

Я бы go за Pandas путь.

import pandas as pd

URL = 'http://zipatlas.com/us/pa/philadelphia/zip-code-comparison/median-household-income.htm'

df = pd.read_html(URL)[11]
df.columns = df.iloc[0]
df = df[1:]
df.drop(columns='#', inplace=True)
print(df.head())

# to csv

df.to_csv('data.csv', index=False)

Вы можете изменить типы данных Pandas с помощью df['column_name'] = df['column_name'].astype(float)

2 голосов
/ 13 апреля 2020

Таблица уже имеет attribute!

enter image description here

Так что мы можем использовать это с pandas read_html

attrs={'rules': 'all'}

Со следующим коротким и простым кодом:

import pandas as pd

df = pd.read_html(
    "http://zipatlas.com/us/pa/philadelphia/zip-code-comparison/median-household-income.htm", 
    attrs={'rules': 'all'}, 
    header=0, 
    index_col="#")[0]

print(df)

enter image description here

2 голосов
/ 13 апреля 2020

Если вы используете теги <table>, то вам нужно использовать Pandas 'read_html() (он использует BeautifulSoup под капотом, но делает работу за вас). Он вернет список данных. Таблица, за которой вы следите, является таблицей в позиции индекса 11. Тогда вам нужно лишь манипулировать кадром данных, чтобы получить то, что вы хотите.

import pandas as pd

income_url  = 'http://zipatlas.com/us/pa/philadelphia/zip-code-comparison/median-household-income.htm'
dfs = pd.read_html(income_url )

df = dfs[11]
df.columns = df.iloc[0,:]
df = df.iloc[1:,:].reset_index(drop=True)

Если вы после этой конкретной таблицы по тегам / атрибутам, вы правильно, у него нет атрибута class. Но вы не ограничены, чтобы найти только класс. На этом сайте таблица имеет атрибут rules="all" или frame="box", поэтому вы можете использовать один из них:

from bs4 import BeautifulSoup
import requests

income_url = "http://zipatlas.com/us/pa/philadelphia/zip-code-comparison/median-household-income.htm"
headers = {"User-Agent": "Mozilla/5.0"}

response = requests.get(income_url,headers = headers)
response.status_code

soup = BeautifulSoup(response.content,"html.parser")
table = soup.find('table',{'rules':'all'})

df = pd.read_html(str(table))[0]
df.columns = df.iloc[0,:]
df = df.iloc[1:,:].reset_index(drop=True)

Вывод:

print (df.to_string())
0     # Zip Code               Location                        City Population Avg. Income/H/hold National Rank
0    1.    19113  39.870679, -75.247782  Philadelphia, Pennsylvania        136         $70,833.00        #1,450
1    2.    19106  39.950472, -75.147231  Philadelphia, Pennsylvania       8359         $61,720.00        #2,617
2    3.    19118  40.072443, -75.212415  Philadelphia, Pennsylvania       9608         $60,179.00        #2,986
3    4.    19154  40.095521, -74.981818  Philadelphia, Pennsylvania      35606         $51,949.00        #5,075
4    5.    19119  40.052013, -75.192553  Philadelphia, Pennsylvania      28873         $46,520.00        #7,487
5    6.    19116  40.115569, -75.013276  Philadelphia, Pennsylvania      32560         $44,776.00        #8,502
6    7.    19128  40.049525, -75.230253  Philadelphia, Pennsylvania      36420         $43,629.00        #9,136
7    8.    19127  40.027929, -75.224083  Philadelphia, Pennsylvania       5465         $43,490.00        #9,226
8    9.    19150  40.072482, -75.171735  Philadelphia, Pennsylvania      25274         $42,342.00       #10,007
9   10.    19114  40.069361, -75.000264  Philadelphia, Pennsylvania      31083         $41,592.00       #10,652
10  11.    19115  40.092757, -75.042597  Philadelphia, Pennsylvania      31853         $39,075.00       #12,928
11  12.    19130  39.967905, -75.174735  Philadelphia, Pennsylvania      22874         $38,668.00       #13,307
12  13.    19111  40.063318, -75.077631  Philadelphia, Pennsylvania      58874         $37,996.00       #13,922
13  14.    19103  39.952795, -75.173949  Philadelphia, Pennsylvania      19714         $37,959.00       #13,970
14  15.    19152  40.061595, -75.046385  Philadelphia, Pennsylvania      31379         $37,760.00       #14,143
15  16.    19149  40.037448, -75.065561  Philadelphia, Pennsylvania      48483         $37,210.00       #14,713
16  17.    19153  39.894414, -75.232375  Philadelphia, Pennsylvania      12324         $36,872.00       #15,129
17  18.    19129  40.015462, -75.182928  Philadelphia, Pennsylvania      10748         $36,465.00       #15,573
18  19.    19136  40.040272, -75.020603  Philadelphia, Pennsylvania      40080         $35,650.00       #16,647
19  20.    19102  39.953423, -75.165384  Philadelphia, Pennsylvania       4396         $35,625.00       #16,711
20  21.    19126  40.056119, -75.136564  Philadelphia, Pennsylvania      16484         $34,607.00       #17,924
21  22.    19135  40.022732, -75.049612  Philadelphia, Pennsylvania      30881         $34,584.00       #17,946
22  23.    19147  39.936633, -75.153153  Philadelphia, Pennsylvania      32680         $34,431.00       #18,129
23  24.    19151  39.979740, -75.256726  Philadelphia, Pennsylvania      31255         $33,840.00       #18,751
24  25.    19138  40.056028, -75.159179  Philadelphia, Pennsylvania      34477         $32,248.00       #20,628
25  26.    19137  39.995604, -75.074623  Philadelphia, Pennsylvania       8069         $31,761.00       #21,311
26  27.    19120  40.034147, -75.119198  Philadelphia, Pennsylvania      68831         $31,588.00       #21,529
27  28.    19131  39.986772, -75.219521  Philadelphia, Pennsylvania      47044         $30,099.00       #23,512
28  29.    19141  40.037904, -75.145392  Philadelphia, Pennsylvania      34984         $28,861.00       #24,807
29  30.    19125  39.977245, -75.125222  Philadelphia, Pennsylvania      23646         $28,679.00       #24,999
30  31.    19124  40.017119, -75.092814  Philadelphia, Pennsylvania      63131         $28,574.00       #25,098
31  32.    19144  40.031929, -75.176099  Philadelphia, Pennsylvania      46794         $27,436.00       #26,201
32  33.    19148  39.913130, -75.155421  Philadelphia, Pennsylvania      48573         $27,097.00       #26,529
33  34.    19145  39.913431, -75.191556  Philadelphia, Pennsylvania      45647         $26,655.00       #26,971
34  35.    19142  39.921746, -75.233277  Philadelphia, Pennsylvania      29063         $25,973.00       #27,536
35  36.    19143  39.942892, -75.225460  Philadelphia, Pennsylvania      71169         $25,826.00       #27,668
36  37.    19146  39.939069, -75.182585  Philadelphia, Pennsylvania      35783         $24,803.00       #28,329
37  38.    19107  39.951623, -75.158637  Philadelphia, Pennsylvania      12340         $24,448.00       #28,539
38  39.    19139  39.961529, -75.230259  Philadelphia, Pennsylvania      43866         $21,329.00       #30,102
39  40.    19123  39.964212, -75.147103  Philadelphia, Pennsylvania       9818         $21,096.00       #30,195
40  41.    19134  39.992219, -75.107863  Philadelphia, Pennsylvania      57922         $20,903.00       #30,253
41  42.    19140  40.011789, -75.145282  Philadelphia, Pennsylvania      57125         $20,077.00       #30,509
42  43.    19132  39.996457, -75.170586  Philadelphia, Pennsylvania      41709         $18,777.00       #30,808
43  44.    19122  39.977688, -75.145885  Philadelphia, Pennsylvania      19589         $18,395.00       #30,887
44  45.    19104  39.960323, -75.197883  Philadelphia, Pennsylvania      50125         $16,151.00       #31,267
45  46.    19121  39.981980, -75.179120  Philadelphia, Pennsylvania      34935         $15,888.00       #31,300
46  47.    19133  39.993092, -75.141671  Philadelphia, Pennsylvania      27971         $13,828.00       #31,507
47  48.    19112  39.893156, -75.168944  Philadelphia, Pennsylvania         29              $0.00       #31,963
48  49.    19108  39.959626, -75.160879  Philadelphia, Pennsylvania          0              $0.00       #31,977
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...