#python #web-scraping #beautifulsoup
#python #очистка от веб-страниц #beautifulsoup
Вопрос:
Я пытаюсь очистить данные из второго столбца таблицы, но не удалось…
Вот мой код:
import bs4
import requests
url = "https://en.wikipedia.org/wiki/List_of_postcode_districts_in_the_United_Kingdom"`
data=requests.get(url)
soup=bs4.BeautifulSoup(data.text,'html.parser')
My_table = soup.find('table',{'class':'wikitable sortable'})
#print(My_table)
My_row = My_table.find_all('tr')
#print(My_row[1])
for row in My_row:
data= (row.find('td')[1].text)
print(data)
Вот ошибка:
Ошибка типа: объект ‘int’ не поддается подписке
Каким будет лучшее решение?
Комментарии:
1. Проблема здесь:
data= (row.find('td')[1].text)
: «row.find(td)» не возвращает массив. Вопрос: Какой у вас отладчик Python или IDE? ПРЕДЛОЖЕНИЕ: 1) реорганизуйте свой код, чтобыrowdata = row.find('td')
, 2) Установите точку останова, затем 3) точно определите, что такое rowdata «типа»?2. @paulsm4 Я использую Spyder
Ответ №1:
Этот код, кажется, работает
import bs4
import requests
url = "https://en.wikipedia.org/wiki/List_of_postcode_districts_in_the_United_Kingdom"
data = requests.get(url)
soup = bs4.BeautifulSoup(data.text, 'html.parser')
table = soup.find('table', {'class': 'wikitable sortable'})
rows = table.find_all('tr')
for i, row in enumerate(rows):
if i > 0:
for j, td in enumerate(row.children):
if j == 3:
print(td.text.strip())
Ответ №2:
Вы можете использовать read_html из pandas
import pandas as pd
tables = pd.read_html('https://en.wikipedia.org/wiki/List_of_postcode_districts_in_the_United_Kingdom')
print(tables[1][1])
Все 4 столбца используют:
print(tables[1])
Это фрейм данных, поэтому вы можете нарезать его по мере необходимости. Он возвращает [1503 строки x 4 столбца]
Комментарии:
1. таким образом, мы получаем не все данные.
2. вам нужен один столбец правильно? В противном случае используйте print (tables[1]) для цикла, т.е. для таблицы в таблицах:
3. Мне нужны данные второго столбца
4. используйте print(таблицы[1])
5. Мы не получаем полностью данные из-за первого столбца. Есть ли какой-либо другой способ получить данные только второго столбца?
Ответ №3:
Попробуйте приведенный ниже код.Это должно сработать.Он вернет текст второго столбца.
import bs4
import requests
url="https://en.wikipedia.org/wiki/List_of_postcode_districts_in_the_United_Kingdom"
data=requests.get(url)
soup=bs4.BeautifulSoup(data.text,'html.parser')
My_table = soup.find('table',{'class':'wikitable sortable'})
My_row = My_table.find_all('tr')
for row in My_row:
data= row.find_next('td').find_next('td')
print(data.text.strip())
Вывод:
AB10, AB11, AB12, AB15, AB16, AB21, AB22, AB23, AB24, AB25, AB99non-geo
AB10, AB11, AB12, AB15, AB16, AB21, AB22, AB23, AB24, AB25, AB99non-geo
AB13
AB14
AB30
AB31
AB32
AB33
AB34
AB35
AB36
AB37
AB38
AB39
AB41
AB42
AB43
AB44
AB45
AB51
AB52
AB53
AB54
AB55
AB56
AL01 AL1, AL2, AL3, AL4
AL05 AL5
AL06 AL6, AL7shared
AL07 AL7shared, AL8
AL09 AL9, AL10
B001 B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15, B16, B17, B18, B19, B20, B21, B23, B24, B25, B26, B27, B28, B29, B30, B31, B32, B33, B34, B35, B36, B37, B38, B40, B42, B43, B44, B45, B46, B47, B48,B99non-geo
B049 B49, B50
B060 B60, B61
B062 B62, B63
B064 B64
B065 B65
B066 B66, B67
B068 B68, B69
B070 B70, B71
B072 B72, B73, B74, B75, B76
B077 B77, B78, B79
B080 B80
B090 B90, B91, B92, B93, B94
B095 B95
B096 B96, B97, B98
BA01 BA1, BA2
BA03 BA3
BA04 BA4
BA05 BA5
BA06 BA6
BA07 BA7
BA08 BA8
BA09 BA9shared
BA09 BA9,non-geo shared[2] BA10
BA11
BA12
BA13
BA14
BA15
BA16
BA20, BA21, BA22
BB01 BB1, BB2, BB6
BB03 BB3
BB04 BB4
BB05 BB5
BB07 BB7
BB08 BB8
BB09 BB9
BB10, BB11, BB12
BB18, BB94non-geo
BD01 BD1, BD2, BD3, BD4, BD5, BD6, BD7, BD8, BD9, BD10, BD11, BD12, BD13, BD14, BD15, BD98,non-geo shared BD99non-geo
BD16, BD97non-geo
BD17, BD18, BD98non-geo shared
BD19
BD20, BD21, BD22
BD23, BD24shared
BD24shared
BF01 BF1non-geo
BH01 BH1, BH2, BH3, BH4, BH5, BH6, BH7, BH8, BH9, BH10, BH11
BH12, BH13, BH14, BH15, BH16, BH17
BH18
BH19
BH20
BH21
BH22
BH23
BH24
BH25
BH31
BL00 BL0,
Ответ №4:
В последних версиях Beautiful Soup (4.7 ) используется пакет под названием Soup Sieve, который обеспечивает поддержку селектора. Лично я считаю, что CSS-селекторы проще использовать для такого рода вещей. Вы можете ознакомиться со всеми функциями CSS-селектора, которые он поддерживает, здесь: https://facelessuser.github.io/soupsieve/selectors /.
Эта проблема на самом деле очень проста с селекторами. Было бы еще проще, если бы была реализована поддержка CSS 4-го уровня :nth-col
, но это все еще довольно просто без:
Здесь мы просто нацеливаемся на таблицу и нацеливаемся на каждый второй td
элемент в каждой строке.
import bs4
import requests
url = "https://en.wikipedia.org/wiki/List_of_postcode_districts_in_the_United_Kingdom"
data = requests.get(url)
soup = bs4.BeautifulSoup(data.text, 'html.parser')
for td in soup.select('table.wikitable.sortable tr td:nth-child(2)'):
print(td.text.strip())
Усеченный вывод:
AB10, AB11, AB12, AB15, AB16, AB21, AB22, AB23, AB24, AB25, AB99non-geo
AB13
AB14
AB30
AB31
AB32
AB33
AB34
AB35
AB36
AB37
AB38
AB39
AB41
AB42
AB43
AB44
AB45
AB51
AB52
AB53
AB54
AB55
AB56
AL01 AL1, AL2, AL3, AL4
AL05 AL5
AL06 AL6, AL7shared
AL07 AL7shared, AL8
AL09 AL9, AL10
B001 B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14, B15, B16, B17, B18, B19, B20, B21, B23, B24, B25, B26, B27, B28, B29, B30, B31, B32, B33, B34, B35, B36, B37, B38, B40, B42, B43, B44, B45, B46, B47, B48,B99non-geo
B049 B49, B50
Комментарии:
1. Это с помощью BeautifulSoup 4.7.1