Показать текст внутри тегов BeautifulSoup - PullRequest
0 голосов
/ 05 марта 2019

Я пытаюсь показать только текст внутри тега, например:

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

Я хочу показать только

"$ 71,996"

Мой код:

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)

Где я ошибаюсь?

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

На самом деле request не возвращает никаких response.Как я вижу, код ответа - 500, что означает проблему в сети, и вы не получаете никаких данных.

Вам не хватает только user-agent, которое вам нужно отправить в headers вместе с request.

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])))

вывод

$71,412  
$75,476  
$77,001  
$77,822  
$107,271 
...
0 голосов
/ 05 марта 2019

Чтобы получить текст внутри тегов, есть несколько подходов:

a) Используйте атрибут тега .text.

cars = soup.find_all('span', attrs={'class': 'listing-row__price'})
for tag in cars:
    print(tag.text.strip())

Вывод

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

b) Использование get_text ()

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

c) Если внутри есть только эта строка внутритег , вы также можете использовать эти опции

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

т.е.

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))

Выходы:

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

Примечание:

.text и .string не совпадают.Если в теге есть другие элементы, .string возвращает None, а .text возвращает текст внутри тега.

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)

Outputs

None
hello there
0 голосов
/ 05 марта 2019

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

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