#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 для получения данных.