Как Python'у приказать не удалять переменную
Здраствуйте, у меня происходит такая ситуация:
У меня есть код:
CONTENT = {"title": [], "publisher": [], "id": [], "price": []}
htmler = BS(self.parsing_html(), "lxml")
row_NineCol_search = htmler.find(
"div",
attrs={"class": "col-9 search-results"}
)
Вроде row_NineCol_search имеет постоянно значение None
из-за этого возникает вторая понятная для меня ошибка
AttributeError: 'NoneType' object has no attribute 'find_all'
Почему же я взял что переменная удаляется Python'ом?
Потому-что когда я сразу вывожу переменную htmler то всё работает.
Тогда возникает вопрос: "Почему же Python удаляет переменную если на её есть ссылки"
Как я понял и как знаю Python только удаляет переменные на которых нет ссылок,
а точнее когда они заканчиваются. Так тогда почему Python не видит этих ссылок?
UPDATE Вот полностью код:
import requests
from bs4 import BeautifulSoup as BS
class Parsing_Logic():
"""Сама логика."""
__slots__ = ("url", "totalPages", "details",)
def __init__(self, url):
"""Конструктор."""
self.url = url
def parsing_html(self) -> str:
"""Отвечает за запрос html кода страници."""
r = requests.get(self.url)
return r.text
def parsing_content(self) -> list:
"""Парсинг основных данных со страници."""
CONTENT = {"title": [], "publisher": [], "id": [], "price": []}
htmler = BS(self.parsing_html(), "lxml")
row_NineCol_search = htmler.find(
"div",
attrs={"class": "col-9 search-results"}
)
blocks_info = row_NineCol_search.find_all(
"div",
class_="search-registry-entry-block"
)
for block_info in blocks_info:
block_title = block_info.find(
"div",
attrs={"class": "registry-entry__body-value"}
).text.strip()
CONTENT["title"].append(block_title)
block_publisher = block_info.find(
"div",
attrs={"class": "registry-entry__body-href"}
).text.strip()
CONTENT["publisher"].append(block_publisher)
block_Number = block_info.find(
"div",
attrs={"class": "registry-entry__header-mid__number"}
).text.strip()
CONTENT["id"].append(block_Number)
block_price = block_info.find(
"div",
attrs={"class": "price-block__value"}
).text.strip()
CONTENT["price"].append(block_price)
print(CONTENT["title"], "\n\n\n\n\n", CONTENT["publisher"], "\n\n\n\n\n", CONTENT["id"], "\n\n\n\n\n", CONTENT["price"])
info = Parsing_Logic("")
info.parsing_content()
Ссылку убрал потому что слишком большая но вот она:
https://zakupki.gov.ru/epz/order/extendedsearch/results.html?searchString=&morphology=on&search-filter=%D0%94%D0%B0%D1%82%D0%B5+%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%89%D0%B5%D0%BD%D0%B8%D1%8F&pageNumber=1&sortDirection=false&recordsPerPage=_10&showLotsInfoHidden=false&savedSearchSettingsIdHidden=&sortBy=UPDATE_DATE&fz44=on&fz223=on&af=on&ca=on&pc=on&pa=on&placingWayList=&selectedLaws=&priceFromGeneral=&priceFromGWS=&priceFromUnitGWS=&priceToGeneral=&priceToGWS=&priceToUnitGWS=¤cyIdGeneral=-1&publishDateFrom=&publishDateTo=&applSubmissionCloseDateFrom=&applSubmissionCloseDateTo=&customerIdOrg=&customerFz94id=&customerTitle=&okpd2Ids=&okpd2IdsCodes=
Если нельзя указать чтобы python не удалял определённую переменную то тогда подскажите как по другому это исправить
Ответы (1 шт):
Нашёл способ. Проблема в том что BeatifulSoup4 имеет несколько режимов:
- html.parser - он смешивает в себе качество и скорость
- lxml - он очень быстрый но из за этого информация может бить не правильно передана или потеряна.
- xml или же xml-lxml - такой же как lxml но поддерживает анализатор XML
- html5lib - самый медленный но с ним у вас будет приходить весь исходный код
Так вот из-за того что я использовал lxml данные чаще всего плохо передавались и из-за этого были все проблемы. Для тех у кого такая же проблема предлагаю перейти на html.parser или же html5lib. Если же вы не хотите то скачайте весь код который передает вам BeatifulSoup4 и уже тогда правильно обращайтесь к объектам.
Изменено: Ставьте USER-AGENT ещё, потому что все сайты будут думать что это бот и заблокируют вас на сайте или же не будут передавать вам весь HTML код.