Я новичок в очистке python. Для пробы я искал на странице Google «города в Огайо». Я хочу царапать результат, то есть название городов, которые находятся в полях с изображениями (мне просто нужен текст). Хотя есть много div, поэтому я не понимаю, как найти div, который имеет название города, которое является текстом. Я просто хочу царапать текст, написанный под Columbus. Я хочу этого Колумба. И название другого города также находится в этом div.
Не могли бы вы научиться этому?
import bs4
import requests
import html.parser
import lxml,
res = requests.get('https://www.google.com/search?rlz=1C1CHBF_enIN818IN818&ei=KejsXJTSLdu0rQGk3aeQDw&q=cities+in+Ohio&oq=cities+in+Ohio&gs_l=psy-ab.3..0i71l8.826656.826656..826671...0.0..0.0.0.......0....2j1..gws-wiz.N2bmaS9Bitw')
soup = bs4.BeautifulSoup(res.text, 'lxml')
type(soup)
<class 'bs4.BeautifulSoup'>
soup.select('.wfg6Pb')[]
Вывод всегда [] . Пожалуйста, используйте ссылку в коде, чтобы получить результат.
чтобы сделать эту работу для меня, мне нужно было сделать 2 вещи:
hl=en&gl=en
), иначе я получил бы результаты на иврите (серфинг из Израиля...)в общем, мой код выглядит так:
import bs4
import requests
import html.parser
import lxml
res = requests.get('https://www.google.com/search?hl=en&gl=en&rlz=1C1CHBF_enIN818IN818&ei=KejsXJTSLdu0rQGk3aeQDw&q=cities+in+Ohio&oq=cities+in+Ohio&gs_l=psy-ab.3..0i71l8.826656.826656..826671...0.0..0.0.0.......0....2j1..gws-wiz.N2bmaS9Bitw')
soup = bs4.BeautifulSoup(res.content, 'lxml')
city_divs = soup.select('a.Mlb36b div.s3v9rd')
city_names = [c.text for c in city_divs]
и вывод для city_divs
:
[<div class = "BNeawe s3v9rd AP7Wnd">Columbus</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Cleveland</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Cincinnati</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Dayton</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Toledo</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Akron</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Youngstown</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Findlay</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Kent</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Chillicothe</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Westerville</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Zanesville</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Wooster</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Elyria</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Hilliard</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Grove City</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Lorain</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Massillon</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Perrysburg</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Strongsville</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Cuyahoga Falls</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Maumee</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Reynoldsburg</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Stow</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Port Clinton</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Pickerington</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Steubenville</div>,
<div class = "BNeawe s3v9rd AP7Wnd">North Canton</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Gahanna</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Ashtabula</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Beachwood</div>,
<div class = "BNeawe s3v9rd AP7Wnd">New Philadelphia</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Miamisburg</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Wadsworth</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Bellefontaine</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Painesville</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Put‑in‑Bay</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Worthington</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Twinsburg</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Chagrin Falls</div>,
<div class = "BNeawe s3v9rd AP7Wnd">North Olmsted</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Barberton</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Canal Winchester</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Wright‑Patterson Air Force...</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Yellow Springs</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Shaker Heights</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Oberlin</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Upper Arlington</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Blue Ash</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Rocky River</div>,
<div class = "BNeawe s3v9rd AP7Wnd">Pataskala</div>]
а для city_names
это:
['Columbus',
'Cleveland',
'Cincinnati',
'Dayton',
'Toledo',
'Akron',
'Youngstown',
'Findlay',
'Kent',
'Chillicothe',
'Westerville',
'Zanesville',
'Wooster',
'Elyria',
'Hilliard',
'Grove City',
'Lorain',
'Massillon',
'Perrysburg',
'Strongsville',
'Cuyahoga Falls',
'Maumee',
'Reynoldsburg',
'Stow',
'Port Clinton',
'Pickerington',
'Steubenville',
'North Canton',
'Gahanna',
'Ashtabula',
'Beachwood',
'New Philadelphia',
'Miamisburg',
'Wadsworth',
'Bellefontaine',
'Painesville',
'Put‑in‑Bay',
'Worthington',
'Twinsburg',
'Chagrin Falls',
'North Olmsted',
'Barberton',
'Canal Winchester',
'Wright‑Patterson Air Force...',
'Yellow Springs',
'Shaker Heights',
'Oberlin',
'Upper Arlington',
'Blue Ash',
'Rocky River',
'Pataskala']
Когда я использую for i в супе. выберите ('a'): print (i.text) он дает весь текст на странице под «<a>», и текст, который мне нужен, также находится в «a», но в другом разд. Итак, можно ли ограничить код, чтобы удалить только текст под этим <div class = "wfg6Pb"> of 'a'
А родительский элемент div 'a' и < div class = "wfg6Pb"> равен <div class = "uais2d">
Вместо того, чтобы самому лазить туда через свой браузер (который может выполнять больше действий на основе скриптов и прочего), я просто проверил, как выглядит ответ get (на Python). Я нашел div с текстом «Колумбус» и проложил себе путь оттуда.
Если вы запустите мой код как есть, вы получите другие результаты? это не работает для вас?
Это сработало и дало мне тот же результат, что и ваш вывод. Но я хочу выучить фрагмент текста из внутреннего div. Например, используйте это «для i в супе. выберите ('a'): print (i.text)» и посмотрите результат. Среди результатов мне нужны только названия городов, а не что-то еще. Это возможно?
Кстати, наконец, я сделал это. Это было случайно, но да сделал это. Спасибо за вашу поддержку.
все зависит от конкретной структуры веб-страницы и определения места размещения необходимых данных. здесь мне помог тот факт, что у вас могут быть сложные селекторы с условиями для родителей, а не только для нужного вам div.
Привет, Адам, где ты нашел эти "Mlb36b" и "s3v9rd". Я пытался, но не смог найти в коде после проверки. Кстати, я нацелился на <div class = "wfg6Pb"> этот div, чтобы удалить текст.