Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » Python для новичков
  • » Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup [RSS Feed]

#1 Март 26, 2023 09:39:13

Klakk
Зарегистрирован: 2022-02-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

Всем привет.
Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup
Через DevTool в ответе отображается нормально: div class=“form-group”, а если смотреть код страницы и код при запросе через модуль Requests, то код выглядит уже так: div class=\“form-group\”, т.е. лишние слеши добавляются.

Отредактировано Klakk (Март 26, 2023 09:50:47)

Офлайн

#2 Март 26, 2023 11:36:30

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

Приведи код страницы и код запроса в requests.



Офлайн

#3 Март 26, 2023 22:22:37

Klakk
Зарегистрирован: 2022-02-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

py.user.next
Приведи код страницы и код запроса в requests.

Код запроса:

from requests import Session
from bs4 import BeautifulSoup
headers = {“user-agent”: “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 YaBrowser/23.1.2.987 Yowser/2.5 Safari/537.36”}
work = Session()
url = f'https/вырезал адрес.ru/aggregator/7159581'
r = work.get(url, headers=headers)
soup = BeautifulSoup(r.text, ‘lxml’)
print(soup)

Часть кода страницы. Сначала структурировано, потом “каша” и в этой каше нужные мне данные:

<div class=“tab-content”></div>
</div>
<div class=“h-loader”>
<div class=“h-loader__content”>
<svg class=“h-loader__icon” height=“30px” width=“30px”>
<circle class=“path” cx=“15” cy=“15” fill=“none” r=“12” stroke-miterlimit=“10” stroke-width=“2”></circle>
</svg>
Пожалуйста, подождите…
</div>
</div>
<script type=“text/javascript”>
“use strict”;
$(document).ready(function () {
var id = tabs.updateTab(null, null, “<div class=\”hook-details1679850205 hook-details\“>\n <title>#7159581 Строительная заявка<\/title>\n\n <div class=\”agg-details__header sticky opaque\“>\n <div class=\”hidden js–order-notifications\“ id=\”notify_7159581\“\n data-mercure-url=\”https/вырезал адрес.ru:7003/.well-known/mercure\“\n data-order=\”7159581\“><\/div>\n <div class=\”clearfix form-text agg-order-title\“>\n <\span>\n <\span>Строительная заявка #<a href=\”/aggregator/7159581\“\n class=\”js–load-tab js–new-tab js–same-or-new-tab\“>7159581<\/a>\n <\/span>\n <button class=\”copy-paste btn btn-xs btn-default btn-copy\“\n data-clipboard-text=\”7159581\“\n title=\”Скопировать номер заявки в буфер обмена\“>\n <i class=\”glyphicon glyphicon-copy\"><\/i>\n<\/button>\n <\/span>\n

Отредактировано Klakk (Март 26, 2023 22:24:15)

Офлайн

#4 Март 27, 2023 00:43:51

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

Это код на языке JavaScript, который встроен в HTML-страницу в виде текста. Бэкслеши там из-за того, что это всё один строковой литерал в JavaScript-коде. То есть это строка, в которой записаны куски HTML-кода.

Так что ты можешь сначала вырезать всю эту строку из JavaScript-кода с помощью модуля re (регулярные выражения). И потом эту строку можно подать в BeautifulSoup напрямую, чтобы сформировать из неё HTML-документ. И в нём потом можно будет искать классы тегов.

Пример работы с текстом

  
>>> import bs4
>>> 
>>> text = "a<div class=\"x\">b</div><div class=\"y\">c</div>d"
>>> 
>>> doc = bs4.BeautifulSoup(text, 'html.parser')
>>> node = doc.find('div', class_='y')
>>> print(node.text)
c
>>>



Офлайн

#5 Март 27, 2023 21:44:34

Klakk
Зарегистрирован: 2022-02-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

py.user.next
Так что ты можешь сначала вырезать всю эту строку из JavaScript-кода с помощью модуля re
Спасибо за совет. Выдрал строку из кода JavaScript через re:
 r = work.get(url, headers=headers).text
m = re.search('null, null, \"(.+?)\", null', r) #текст [b]null, null, "[/b] после которой начинается искомая строка, текст [b]", null[/b] перед которым заканчивается искомая строка
if m:
    found = m.group(1)
… и не могу разобраться почему, эта строка записанная в found при печати print(found) выводится одной строчкой, т.е. переносы на новую строку не отрабатываются, а если эту же строку скопировать из кода JavaScript и записать в строку типа:
 text = 'div class=\”hook-details1679850205 hook-details\“>\n <title>#7159581 Строительная заявка<\/title>\n\n <div class=\”agg-details__header sticky opaque\“>\n <div class=\”hidden js–order-notifications\“ id=\”notify_7159581\“\n data-mercure-url=\”https/вырезал адрес.ru:7003/.well-known/mercure\“\n data-order=\”7159581\“><\/div>\n <div class=\”clearfix form-text agg-order-title\“>\n'
print (text)
и при таком раскладе каждые следующие строчки после \n выводятся с новой строки.

Не пойму почему так…

Отредактировано Klakk (Март 28, 2023 07:10:05)

Офлайн

#6 Март 27, 2023 23:48:45

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

[code python]
все коды на форуме пиши в такой конструкции
[/code]

Сделай
  
print(repr(found))
и вывод сюда скинь.

Только теги code используй, потому что движок форума у простого текста заменяет и стирает символы. Видишь код в белой рамке? Вот так же сделай со всеми своими фрагментами кода, чтобы код был в белой рамке.



Отредактировано py.user.next (Март 27, 2023 23:49:42)

Офлайн

#7 Март 28, 2023 08:18:37

Klakk
Зарегистрирован: 2022-02-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

 m = re.search('null, null, \"(.+?)\", null', r)
if m:
    found = m.group(1)
list = 'div class=\"hook-details1679980270 hook-details\">\n    <title>#7159581 Строительная заявка<\/title>\n\n    <div class=\"agg-details__header sticky opaque\">\n '
print(found[1:-511368])
print(repr(found[1:-511368]))
print(repr(list))
print(list)

Это 4 принта
 div class=\"hook-details1679980537 hook-details\">\n    <title>#7159581 Строительная заявка<\/title>\n\n    <div class=\"agg-details__header sticky opaque\">\n 
'div class=\\"hook-details1679980537 hook-details\\">\\n    <title>#7159581 Строительная заявка<\\/title>\\n\\n    <div class=\\"agg-details__header sticky opaque\\">\\n '
'div class="hook-details1679980270 hook-details">\n    <title>#7159581 Строительная заявка<\\/title>\n\n    <div class="agg-details__header sticky opaque">\n '
div class="hook-details1679980270 hook-details">
    <title>#7159581 Строительная заявка<\/title>
    <div class="agg-details__header sticky opaque">
 

Офлайн

#8 Март 28, 2023 08:36:40

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

Надо подредактировать его после взятия через re.

  
>>> text = 'div class=\\"hook-details1679980537 hook-details\\">\\n    <title>#7159581 Строительная заявка<\\/title>\\n\\n    <div class=\\"agg-details__header sticky opaque\\">\\n '
>>> 
>>> newtext1 = text.replace('\\"', '"')
>>> newtext2 = newtext1.replace('\\n', '\n')
>>> newtext3 = newtext2.replace('\/', '/')
>>> newtext4 = '<{}</div></div>'.format(newtext3)
>>> 
>>> out = newtext4
>>> 
>>> print(out)
<div class="hook-details1679980537 hook-details">
    <title>#7159581 Строительная заявка</title>
 
    <div class="agg-details__header sticky opaque">
 </div></div>
>>>
>>> import bs4
>>> 
>>> doc = bs4.BeautifulSoup(out, 'html.parser')
>>> node = doc.find('title')
>>> print(node.text)
#7159581 Строительная заявка
>>>
И когда у тебя будет полноценный HTML-код, можно его подать в BeautifulSoup уже.



Отредактировано py.user.next (Март 28, 2023 08:43:58)

Офлайн

#9 Март 28, 2023 08:56:49

Klakk
Зарегистрирован: 2022-02-18
Сообщения: 11
Репутация: +  0  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

py.user.next
И когда у тебя будет полноценный HTML-код, можно его подать в BeautifulSoup уже.
Но все же то, что попадает в found не отличается визуально от того, что записывается в list, а печатается по разному - у found переносы не отрабатываются. Может это скрытые символы или кодировка так влияет?
Еще если я found передаю в BeautifulSoup и печатаю то выдает это:
Traceback (most recent call last):
File “C:\Project\ReqBs4\main.py”, line 68, in <module>
print(soup)
File “C:\Project\ReqBs4\venv\lib\site-packages\bs4\element.py”, line 1621, in __unicode__
return self.decode()
File “C:\Project\ReqBs4\venv\lib\site-packages\bs4\__init__.py”, line 778, in decode
return prefix + super(BeautifulSoup, self).decode(
File “C:\Project\ReqBs4\venv\lib\site-packages\bs4\element.py”, line 1718, in decode
contents = self.decode_contents(
File “C:\Project\ReqBs4\venv\lib\site-packages\bs4\element.py”, line 1815, in decode_contents
s.append(c.decode(indent_level, eventual_encoding,
File “C:\Project\ReqBs4\venv\lib\site-packages\bs4\element.py”, line 1718, in decode
contents = self.decode_contents(

Офлайн

#10 Март 28, 2023 09:49:43

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9727
Репутация: +  843  -
Профиль   Отправить e-mail  

Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup

Klakk
Но все же то, что попадает в found не отличается визуально от того, что записывается в list, а печатается по разному
Ты преобразовал текст?

Klakk
Может это скрытые символы или кодировка так влияет?
Нет.



Офлайн

  • Начало
  • » Python для новичков
  • » Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version