我无法显示html代码

2024-09-27 21:27:50 发布

您现在位置:Python中文网/ 问答频道 /正文

(我是网页抓取的初学者)我想抓取这个链接: 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

当我试图显示回购清单时,我得到的是[],而不是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)

Tags: httpsdivcomwwwrepotrilistinitial
3条回答

当调用find_all时,它返回一个标记列表到html的一个子集,如果没有匹配的标记,则返回一个空列表。所以你要搜索的标签在页面中找不到!这可能有很多原因。你可能在你搜索的类中有一个输入错误,或者你搜索的值不是一个类而是一个id或者其他属性。你知道吗

一些页面(通常是较大的网络应用程序,如facebook、instagram、twitter等)会动态创建类、id等,并采取一些小技巧来防止数据被窃取。如果你想看看一个网站会允许你做些什么,你可以查看所谓的robots.txt。你知道吗

例如,如果你想抓取reddit,你可以去https://reddit.com/robots.txt查看你可以从他们的域中找到的uri列表!网站还将包含一个sitemap,这是一个xml(类似于html)文档,其中包含指向可用页面的链接!你知道吗

您可以将regex输出,进行一点字符串清理,然后传递给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']

很棒的教程:

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)

相关问题 更多 >

    热门问题