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 :
print ([x.text for x in cars])
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 ...
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>
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 ....
Copie possible de Python 3 - Récupérer le texte d'une balise dans beautifulSoup