4
votes

Afficher le texte à l'intérieur des balises BeautifulSoup

J'essaie d'afficher uniquement le texte à l'intérieur de la balise, par exemple:

import requests
from bs4 import BeautifulSoup
from csv import writer

response = requests.get('https://www.cars.com/for-sale/searchresults.action/?mdId=21811&mkId=20024&page=1&perPage=100&rd=99999&searchSource=PAGINATION&showMore=false&sort=relevance&stkTypId=28880&zc=11209')

soup = BeautifulSoup(response.text, 'html.parser')

cars = soup.find_all('span', attrs={'class': 'listing-row__price'})
print(cars)

Je veux afficher uniquement le

«71 996 $»

Mon code est:

<span class="listing-row__price ">$71,996</span>

Où est-ce que je me trompe?


3 Réponses :


2
votes

print ([x.text for x in cars])


0 commentaires

1
votes

En fait, la requête ne renvoie aucune réponse . Comme je le vois, le code de réponse est 500 , ce qui signifie un problème de réseau et vous n'obtenez aucune donnée.

Ce qui vous manque, c'est user-agent que vous devez envoyer dans les en-têtes avec request.

$71,412  
$75,476  
$77,001  
$77,822  
$107,271 
...

output

import requests
import re #regex library
from bs4 import BeautifulSoup

headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36"
}

crawl_url = 'https://www.cars.com/for-sale/searchresults.action/?mdId=21811&mkId=20024&page=1&perPage=100&rd=99999&searchSource=PAGINATION&showMore=false&sort=relevance&stkTypId=28880&zc=11209'
response = requests.get(crawl_url, headers=headers )


cars = soup.find_all('span', attrs={'class': 'listing-row__price'})

for car in cars:
    print(re.sub(r'\s+', '', ''.join([car.text])))

p>


0 commentaires

4
votes

Pour obtenir le texte dans les balises, il existe plusieurs approches,

a) Utilisez l'attribut .text de la balise.

None
hello there

Output

from bs4 import BeautifulSoup
html="""
<p>hello <b>there</b></p>
"""
soup = BeautifulSoup(html, 'html.parser')
p = soup.find('p')
print(p.string)
print(p.text)

b) Utilisez get_text ()

$71,996
$75,831
$71,412
$75,476
$77,001
...

c) S'il y a seulement cette chaîne à l'intérieur de la balise , vous pouvez également utiliser ces options

  • .string
  • .contents[0ITED
  • next(tag.children)
  • next(tag.strings)
  • next(tag.stripped_strings)

ie.

for tag in cars:
    print(tag.string.strip()) #or uncomment any of the below lines
    #print(tag.contents[0].strip())
    #print(next(tag.children).strip())
    #print(next(tag.strings).strip())
    #print(next(tag.stripped_strings))

Sorties :

for tag in cars:
    print(tag.get_text().strip())

Remarque :

.text et .string ne sont pas les mêmes. S'il y a d'autres éléments dans la balise, .string renvoie le Aucun , tandis que .text renverra le texte à l'intérieur de la balise.

$71,996
$75,831
$71,412
$75,476
....


0 commentaires