Я не могу отобразить HTML-код - Beautifulsoup - PullRequest
1 голос
/ 08 мая 2019

(я новичок в поиске в Интернете) Я хочу удалить эту ссылку: https://www.seloger.com/list.htm?tri=initial&idtypebien=1,2&pxMax=3000000&div=2238&idtt=2,5&naturebien=1,2,4&LISTING-LISTpg=2

когда я пытался отобразить repo_list, я получаю это [], а не HTML-код !!! `

import requests
from bs4 import BeautifulSoup

page = requests.get('https://www.seloger.com/list.htm?tri=initial&idtypebien=1,2&pxMax=3000000&div=2238&idtt=2,5&naturebien=1,2,4&LISTING-LISTpg=2')
soup = BeautifulSoup(page.text, 'html.parser')
repo = soup.find(class_="c-wrap")
print(repo)
repo_list = repo.find_all(class_='c-pa-list c-pa-sl c-pa-gold cartouche ')
print(repo_list)

Ответы [ 3 ]

1 голос
/ 08 мая 2019

Вы можете выполнить регулярное выражение, выполнить небольшую очистку строки и затем перейти к json, чтобы затем распечатать каждый продукт в виде словаря, содержащего информацию для каждого списка

import re
import requests
import json

r = requests.get('https://www.seloger.com/list.htm?tri=initial&idtypebien=1,2&pxMax=3000000&div=2238&idtt=2,5&naturebien=1,2,4&LISTING-LISTpg=2', headers = {'User-Agent' : 'Mozilla/5.0'})
p = re.compile('var ava_data =(.*);\r\n\s+ava_data\.logged = logged;', re.DOTALL)
x = p.findall(r.text)[0].strip().replace('\r\n    ','').replace('\xa0',' ').replace('\\','\\\\')
x = re.sub(r'\s{2,}|\\r\\n', '', x)
data = json.loads(x)

for product in data['products']:
    print(product)

Пример возврата (со страницы 3):

{'idannonce': '142830891', 'idagence': '263765', 'idtiers': '284402', 'typedebien': 'Appartement', 'typedetransaction': ['vente'], 'idtypepublicationsourcecouplage': 'SL', 'position': '0', 'codepostal': '77450', 'ville': 'Esbly', 'departement': 'Seine-et-Marne', 'codeinsee': '770171', 'produitsvisibilite': 'AD:AC:BB:AW', 'affichagetype': [{'name': 'liste', 'value': True}], 'cp': '77450', 'etage': '0', 'idtypechauffage': '0', 'idtypecommerce': '0', 'idtypecuisine': 'séparée équipée', 'naturebien': '1', 'si_balcon': '0', 'nb_chambres': '1', 'nb_pieces': '2', 'si_sdbain': '0', 'si_sdEau': '0', 'nb_photos': '14', 'prix': '139900', 'surface': '44'}

Цена, например:

product['prix']
1 голос
/ 09 мая 2019

Отличный урок:

https://www.youtube.com/watch?v=ind-mugxMxk

import re
import requests
from bs4 import BeautifulSoup
from babel.numbers import format_currency

session = requests.session()
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:60.0) Gecko/20100101 Firefox/60.0',
    'Accept': '*/*',
    'Accept-Language': 'en-US,en;q=0.5', # these parameters can be changed as needed
    'Accept-Encoding': 'gzip, deflate, br',
    'content-type': 'application/json',
    'skip-caching': 'true',
    'DNT': '1',
    'Connection': 'keep-alive',
    'TE': 'Trailers'}
url = 'https://www.seloger.com/list.htm?tri=initial&idtypebien=1,2&pxMax=3000000&div=2238&idtt=2,5&naturebien=1,2,4&LISTING-LISTpg=2'
response = session.get(url, headers=headers)
page = response.text
soup = BeautifulSoup(page, "lxml")
for i, div in enumerate(soup.find_all('div', {'class': 'c-pa-price'}), 1):
    price = div.text
    # this regular expression substitution replaces all non alphanumeric characters but leaves in specialized language characters
    price = re.sub('[^0-9A-Za-z\u00c0-\u00d6\u00d8-\u00f6\u00f8-\u02af\u1d00-\u1d25\u1d62-\u1d65\u1d6b-\u1d77\u1d79-\u1d9a\u1e00-\u1eff\u2090-\u2094\u2184-\u2184\u2488-\u2490\u271d-\u271d\u2c60-\u2c7c\u2c7e-\u2c7f\ua722-\ua76f\ua771-\ua787\ua78b-\ua78c\ua7fb-\ua7ff\ufb00-\ufb06]+','', price)
    # remove extra word Bouquet - optional
    extra_word = re.compile('Bouquet')
    if extra_word.search(price):
        price = price.split('Bouquet')[1]
    price = format_currency(int(price), 'EUR', locale='fr_FR')
    print('Inscription ' + str(i) + ':', price)
1 голос
/ 08 мая 2019

Когда вы вызываете find_all, он возвращает список тегов в подмножество HTML, если нет подходящих тегов, он возвращает пустой список. Таким образом, тег, который вы ищете, не найден на странице! Это может быть по ряду причин. У вас может быть опечатка в классе, который вы ищете, или, возможно, значение, которое вы ищете, - это не класс, а идентификатор или какой-либо другой атрибут.

Это также тот случай, когда некоторые страницы (обычно большие веб-приложения, такие как facebook, instagram, twitter и т. Д.) Будут динамически создавать классы, идентификаторы и т. Д. И выполнять небольшие хитрости, чтобы не допустить удаления их данных. Если вы хотите увидеть, что веб-сайт позволит вам очистить, вы можете проверить, что называется robots.txt.

Например, если вы хотите очистить Reddit, вы можете перейти на https://reddit.com/robots.txt и посмотреть список URI, которые вы можете получить из их домена! Сайты также будут включать sitemap, который представляет собой документ XML (аналог HTML), полный ссылок на доступные страницы!

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