Очистка BeautifulSoup возвращает {{ переменную }}, а не текст, отображаемый на странице

#python-3.x #beautifulsoup #screen-scraping

#python-3.x #beautifulsoup #очистка экрана

Вопрос:

Я пытаюсь очистить некоторые данные с веб-сайта, используя BeautifulSoup, и текст, который я получаю, выглядит как теги Django, например, {{ ResultLink }}, а не фактический URL, который я вижу при просмотре источника страницы.

Как бы мне вместо этого получить текст, отображаемый на странице? Возможно ли это в BeautifulSoup?

Мой код таков:

     req = session.get(url, headers=headers)
    bsObj = BeautifulSoup(req.text, 'html.parser')

    if bsObj.find("div", {"id" : {"exactresult"}}) is not None:
        price = bsObj.find_all("div", {"class" : {"price-details"}})[0].get_text()
        link = bsObj.find_all("a", {"class" : {"btn-plate"}})[0].get_text()
  

Оба price и link возвращают переменные внутри {{ }}, а не текст, который отображается на веб-странице.

Я использовал почти идентичный код на многих других веб-сайтах (с соответствующими именами классов и т. Д.) И Там работает нормально, Поэтому появляется что-то конкретное с веб-сайтом, на который я смотрю.

Спасибо

Комментарии:

1. можете ли вы указать URL-адрес?

2. Привет, это url = https://www.regplates.com/search?search={0}'.format(reg)

Ответ №1:

Данные заполняются с помощью Javascript. Вы можете получить данные, отправив POST-запрос в их API с помощью поискового запроса. Это вернет json ответ, который содержит все данные, включая верхние.

 import requests
from bs4 import BeautifulSoup
#change 'ash1' to your search term
payload={"search":"ash1"}
req = requests.post('https://www.regplates.com/api/search',json=payload)
price=req.json()['data']['exact']['price']
link=req.json()['data']['exact']['link']
print(price,link,sep="n")
  

Вывод

 688800
/number-plate/ASH-1
  

Ответ json может быть очень большим в зависимости от поискового запроса. Простой способ понять это — использовать pprint

 import pprint
...
pprint.pprint(req.json())
  

В качестве альтернативы вы также можете использовать selenium для получения данных.