#python #web-scraping
Вопрос:
Я пытаюсь решить этот вопрос
Веб-сайт, с которого я собираю данные, — это новости NBC
Следующий код-это то, что я написал до сих пор, но я не могу получить желаемый результат, который показан в вопросе
Мой Код:
candidate_votes={}
nomin_list=[]
final_table=results_US.find('div',{"class":"jsx-1858457747 df"})
info_list=final_table.find_all('span',{'class':"jsx-4189516194 dn dib-m mb1"})
a=0
for a in info_list:
nomin_list.append(i.get_text())
a=a 1
vote_tag=final_table.find_all('div',{'class':"column-group"})
vote_list=vote_tag.find_all('div',{'class':"jsx-3437879980 dib number f2 founders-mono"})
printint(''.join([c for c in vote_tag.get_text() if c!=','])))
Результат, который я получаю, таков:
TypeError: unsupported operand type(s) for : 'Tag' and 'int'" because of "a=a 1
Я был бы признателен за помощь и рекомендации о том, как можно решить эту проблему!
Комментарии:
1. Jsx-185845.. может быть случайным, т. е. каждый раз разным..
2. Не могли бы вы отобразить выходные данные, полученные из вашего кода?
3. @roshshetty там написано» Ошибка типа: неподдерживаемые типы операндов для : ‘Tag’ и ‘int'» из-за «a=a 1»
Ответ №1:
Вы можете получить данные из json, которые встроены в страницу. Например:
import json
import requests
from bs4 import BeautifulSoup
url = (
"https://www.nbcnews.com/politics/2020-elections/georgia-president-results"
)
soup = BeautifulSoup(requests.get(url).content, "html.parser")
data = json.loads(soup.select_one('[type="application/json"]').contents[0])
# uncomment this to print all data:
# print(json.dumps(data, indent=4))
candidate_votes = {}
for result in data["props"]["pageProps"]["candidateCountyResults"]:
candidate_votes[result["fullName"]] = [
r["votesReceived"] for r in result["countyResults"]
]
for k, v in candidate_votes.items():
print(k)
print(v)
С принтами:
Joe Biden
[1784, 825, 625, 652, 9140, 932, 10453, 12091, 2393, 1269, 43408, 1312, 700, 2791, 6738, 11248, 5208, 3274, 1263, 7967, 1269, 16236, 6932, 1105, 78247, 667, 1854, 42779, 36055, 791, 95466, 744, 221847, 4511, 4190, 29232, 2059, 24210, 1615, 2982, 1261, 2486, 4782, 308162, 2172, 1911, 24568, 42814, 2450, 167, 7718, 2879, 2886, 1324, 2570, 33062, 11917, 42208, 1593, 380212, 2932, 155, 15882, 4384, 3619, 4087, 241994, 3562, 25033, 2976, 1791, 5457, 3157, 824, 73443, 32239, 1008, 7642, 1761, 1028, 4058, 1266, 1222, 4882, 2620, 1019, 8074, 4558, 13104, 1432, 2035, 20116, 3126, 4168, 2612, 2858, 3411, 1312, 4287, 748, 3993, 4385, 980, 3353, 2301, 49446, 29789, 8162, 2439, 29695, 5922, 2824, 1100, 1505, 3657, 1230, 3448, 497, 1984, 1671, 59119, 31237, 462, 2661, 1256, 11828, 2386, 1182, 6314, 2114, 561, 2062, 1388, 1488, 2376, 8708, 5318, 2938, 1550, 952, 11577, 1409, 2044, 2800, 4203, 5770, 12683, 4169, 1468, 4743, 2688, 640, 689, 2411, 10680, 861, 2160, 2074, 2395]
Donald Trump
[6570, 2300, 4017, 897, 8903, 7795, 26804, 37672, 4111, 6419, 26559, 4329, 6993, 4261, 14240, 18387, 5400, 8406, 923, 15249, 3133, 37476, 25167, 3419, 53232, 880, 8064, 99585, 14450, 637, 15811, 2105, 165436, 10578, 11777, 50013, 4900, 51501, 4428, 4985, 6066, 13398, 6755, 58377, 5843, 2159, 10441, 25454, 2710, 1256, 23361, 6226, 6553, 2888, 12169, 37956, 28906, 85123, 9069, 137247, 13429, 1402, 25617, 19405, 7034, 7066, 166400, 16637, 64183, 1154, 12330, 14319, 9465, 4519, 48259, 41540, 3134, 29502, 5822, 4695, 3537, 2161, 2850, 9940, 6331, 2509, 14493, 12007, 7959, 3173, 3527, 25692, 12163, 6169, 4016, 1783, 11326, 2275, 6524, 2066, 4935, 11057, 2960, 8231, 12944, 30107, 23869, 16595, 5592, 54517, 6506, 14110, 7898, 9127, 13587, 2815, 8291, 604, 7474, 1390, 26780, 13014, 1800, 3915, 2613, 18104, 9367, 801, 5733, 1392, 360, 6054, 2420, 2825, 2004, 12969, 10784, 7873, 6384, 2101, 18142, 2349, 2370, 12650, 8606, 23173, 37839, 9903, 1166, 4668, 9987, 748, 1583, 12222, 25644, 2402, 2823, 2665, 6830]
Jo Jorgensen
[36, 30, 25, 6, 208, 74, 664, 701, 60, 55, 747, 67, 56, 49, 357, 455, 75, 91, 12, 470, 29, 760, 494, 44, 1929, 35, 132, 2451, 841, 7, 1053, 12, 6445, 125, 119, 1330, 76, 1088, 59, 66, 107, 197, 88, 4207, 56, 35, 278, 838, 28, 18, 492, 66, 66, 35, 110, 976, 518, 1980, 103, 6320, 164, 8, 489, 244, 54, 91, 5629, 232, 1321, 23, 125, 215, 106, 51, 1296, 1059, 26, 531, 61, 48, 44, 28, 28, 112, 94, 48, 164, 149, 331, 36, 95, 547, 242, 118, 68, 22, 200, 38, 66, 20, 34, 148, 27, 122, 144, 961, 576, 411, 102, 1160, 125, 233, 49, 88, 152, 36, 116, 5, 110, 12, 1110, 430, 13, 51, 19, 279, 132, 7, 101, 16, 7, 69, 34, 21, 36, 195, 177, 103, 45, 24, 328, 33, 30, 108, 96, 411, 571, 117, 16, 66, 104, 3, 13, 183, 442, 16, 47, 31, 60]
Write-ins
[0, 0, 0, 0, 10, 4, 25, 22, 0, 1, 49, 2, 0, 0, 14, 19, 2, 5, 0, 12, 0, 30, 33, 0, 76, 0, 3, 44, 75, 1, 61, 1, 294, 0, 1, 45, 2, 46, 0, 3, 13, 3, 3, 131, 1, 1, 3, 33, 0, 1, 8, 5, 2, 1, 0, 18, 24, 66, 2, 152, 2, 0, 6, 11, 0, 3, 327, 11, 65, 0, 2, 11, 6, 0, 18, 34, 0, 10, 3, 3, 0, 0, 0, 6, 0, 0, 1, 5, 0, 0, 3, 20, 14, 1, 0, 0, 8, 1, 3, 0, 1, 2, 1, 4, 6, 14, 29, 25, 5, 45, 1, 5, 1, 1, 3, 0, 2, 0, 6, 0, 68, 18, 0, 2, 0, 8, 0, 0, 2, 2, 0, 2, 0, 1, 0, 5, 1, 0, 0, 0, 10, 0, 0, 4, 2, 20, 5, 0, 0, 3, 3, 0, 0, 15, 0, 0, 1, 0, 0]
Комментарии:
1. Спасибо! Просто хочу спросить, что мне делать, если я не использую JSON и мне нужно следовать советам, приведенным в вопросе, которые заключаются в следующем: 1. сначала выберите все теги div класса «группа столбцов» 2. затем напишите цикл for для обработки голосов подколонок для каждого из 4 кандидатов 3. Для извлечения текста по строкам требуется второй уровень для цикла 4. используйте выражение int(«.join([c для c в vote_tag.get_text (), если c!=’,’])), чтобы удалить текстовые запятые и преобразовать строковую форму данных в целое значение. Большое вам спасибо за помощь.