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