Атрибут find_all для тега span в Beautiful Soup приводит к ошибке AttributeError: объект ResultSet не имеет атрибута get_text - PullRequest
0 голосов
/ 23 января 2020

Предупреждение: это всего лишь моя вторая попытка ввода кода Python, поэтому я могу делать ошибки, которые могут вызвать проблемы у профессионала:

Я хотел бы получить список городов, используя addressLocality из набора результатов в soup_r:

import requests
from bs4 import BeautifulSoup
URL = 'https://www.tjhughes.co.uk/map'
page = requests.get(URL, verify=False)
soup_r = BeautifulSoup(page.text, 'html.parser')

это тип результата, который я хотел бы получить, указав только название города (в данном случае = Брэдфорд)

single_span = soup_r.find('span',itemprop = 'addressLocality').get_text()

Я хотел бы иметь возможность возвращать полный список результатов в том же формате, что и single_span (ie, изолируя название города), но следующий код выдает ошибку «AttributeError: ResultSet объект не имеет атрибута get_text»

spans_fail = soup_r.find_all('span',itemprop = 'addressLocality').get_text()

Самое близкое, что я могу получить, это сбросить get_text ():

spans = soup_r.find_all('span',itemprop = 'addressLocality')

..., таким образом, возвращая результаты в одном пакете:

[<span itemprop="addressLocality">Bradford</span>, <span itemprop="addressLocality">Birkenhead</span>, <span itemprop="addressLocality">Bootle</span>, <span itemprop="addressLocality">Bury</span>,
...
<span itemprop="addressLocality">Sheffield</span>, <span itemprop="addressLocality">St Helens</span>, <span itemprop="addressLocality">Widnes</span>]

Предполагая, что это лучшее, что я могу сделать, я все еще завязываю узлы, когда пытаюсь перестроить результаты.

Например, это просто возвращает Брэдфорд 52 раза, что сбивает меня с толку, потому что в 26 городах оригинальный список, так что я не знаю, как я удваиваюсь, не говоря уже о том, как получить доступ к другим 25:

cities = []
for check in soup:
    check = soup.find('span',itemprop = 'addressLocality').text
    cities.append(check)

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

Ответы [ 2 ]

0 голосов
/ 23 января 2020

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

Например:

import requests
from bs4 import BeautifulSoup
URL = 'https://www.tjhughes.co.uk/map'
page = requests.get(URL, verify=False)
soup_r = BeautifulSoup(page.text, 'html.parser')

cities = [span.get_text() for span in soup_r.select('span[itemprop="addressLocality"]')]
print(cities)

Отпечатки:

['Bradford', 'Birkenhead', 'Bootle', 'Bury', 'Chelmsford', 'Chesterfield', 'Glasgow', 'Cumbernauld', 'London', 'Coventry', 'Dundee', 'Durham', 'East Kilbride', 'Glasgow', 'Harlow', 'Hartlepool', 'Liverpool', 'Maidstone', 'Middlesbrough', 'Newcastle upon Tyne', 'Nuneaton', 'Oldham', 'Preston', 'Sheffield', 'St Helens', 'Widnes']
0 голосов
/ 23 января 2020

Когда вы переходите к списку отдельных элементов, иногда вам приходится выполнять обрезку строк.

spans = soup_r.find_all('span',itemprop = 'addressLocality')

# [<span itemprop="addressLocality">Bradford</span>, <span 

cities = []
for span in spans:
    left_angle=span.find('>'+1)
    sec_rangle=spane.find('<',1)
    city=span[left_angle:sec_rangle]
    print(city)
    cities.append(city)
print(cities)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...