Findall для тега div с использованием красивого супа дает пустой возврат

<div class="columns small-5 medium-4 cell header">Ref No.</div>
<div class="columns small-7 medium-8 cell">110B60329</div>                                                          

Веб-сайт


person Owen    schedule 03.03.2017    source источник


Ответы (2)


Вы можете сделать это двумя способами.

1) Если вы уверены, что ваш веб-сайт не изменит свое содержимое, вы можете найти все элементы div по этому классу и получить содержимое, указав индекс.

2) Найдите все левые элементы div (заголовки), и если один из них соответствует тому, что вы хотите, получите следующий элемент, чтобы получить текст.

Пример:

import requests
from bs4 import BeautifulSoup as soup

url = 'https://www.saa.gov.uk/search/?SEARCHED=1&ST=&SEARCH_TERM=city+of+edinburgh%2C+BOSWALL+PARKWAY%2C+EDINBURGH&ASSESSOR_ID=&SEARCH_TABLE=valuation_roll_cpsplit&DISPLAY_COUNT=10&TYPE_FLAG=CP&ORDER_BY=PROPERTY_ADDRESS&H_ORDER_BY=SET+DESC&DRILL_SEARCH_TERM=BOSWALL+PARKWAY%2C+EDINBURGH&DD_TOWN=EDINBURGH&DD_STREET=BOSWALL+PARKWAY&UARN=110B60329&PPRN=000000000001745&ASSESSOR_IDX=10&DISPLAY_MODE=FULL#results'

baseurl = 'https://www.saa.gov.uk'

session = requests.session()

response = session.get(url)

# content of search page in soup 
html = soup(response.content,"lxml")

#Method 1
LeftBlockData = html.find_all("div", class_="columns small-7 medium-8 cell")
Reference = LeftBlockData[0].get_text().strip()
Description = LeftBlockData[2].get_text().strip()
print(Reference)
print(Description)

#Method 2
for column in html.find_all("div", class_="columns small-5 medium-4 cell header"):
    RightColumn = column.next_sibling.next_sibling.get_text().strip()
    if "Ref No." in column.get_text().strip():
        print (RightColumn)
    if "Description" in column.get_text().strip():
        print (RightColumn)

Отпечатки будут выводиться (по порядку):

110B60329

ХРАНИТЬ

110B60329

ХРАНИТЬ

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

Например, ваша переменная head [i].text содержит Ref No., поэтому, если вы сравните ее с Ref No., это даст ложный результат. Полоса это решит.

person Zroq    schedule 03.03.2017
comment
Привет! Я следовал той же логике, чтобы попытаться поднять «Оцениваемое значение» с той же страницы, добавив строки RightBlockData = html.find_all(div, class_=columns small-12 medium-5) Rateable_Value = RightBlockData[2].get_text( ).полоска() - person Owen; 09.03.2017
comment
Однако я получил ошибку RightBlockData = html.find_all(div, class_=columns small-12 medium-5) Rateable_Value = RightBlockData[2].get_text().strip() - person Owen; 09.03.2017
comment
Есть идеи, почему Зрок? - person Owen; 09.03.2017

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.saa.gov.uk/search/?SEARCHED=1&ST=&SEARCH_TERM=city+of+edinburgh%2C+BOSWALL+PARKWAY%2C+EDINBURGH&ASSESSOR_ID=&SEARCH_TABLE=valuation_roll_cpsplit&DISPLAY_COUNT=10&TYPE_FLAG=CP&ORDER_BY=PROPERTY_ADDRESS&H_ORDER_BY=SET+DESC&DRILL_SEARCH_TERM=BOSWALL+PARKWAY%2C+EDINBURGH&DD_TOWN=EDINBURGH&DD_STREET=BOSWALL+PARKWAY&UARN=110B60329&PPRN=000000000001745&ASSESSOR_IDX=10&DISPLAY_MODE=FULL#results")
soup = BeautifulSoup(r.text, 'lxml')
for row in soup.find_all(class_='table-row'):

    print(row.get_text(strip=True, separator='|').split('|'))

вне:

['Ref No.', '110B60329']
['Office', 'LOTHIAN VJB']
['Description', 'STORE']
['Property Address', '29 BOSWALL PARKWAY', 'EDINBURGH', 'EH5 2BR']
['Proprietor', 'SCOTTISH MIDLAND CO-OP SOCIETY LTD.']
['Tenant', 'PROPRIETOR']
['Occupier']
['Net Annual Value', '£1,750']
['Marker']
['Rateable Value', '£1,750']
['Effective Date', '01-APR-10']
['Other Appeal', 'NO']
['Reval Appeal', 'NO']

get_text() — очень мощный инструмент, вы можете убрать пробелы и поставить разделитель в тексте.

Вы можете использовать этот метод для получения чистых данных и их фильтрации.

person 宏杰李    schedule 04.03.2017