Соскреб BeautifulSoup возвращает {{variable}}, а не текст, показанный на странице - PullRequest
1 голос
/ 15 апреля 2019

Я пытаюсь очистить некоторые данные с веб-сайта, используя 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 Ответ

0 голосов
/ 15 апреля 2019

Данные заполняются с использованием 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())

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

...