Найти - Пользователи
Полная версия: Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup
Начало » Python для новичков » Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup
1 2
Klakk
Всем привет.
Почему отображаются лишние слеши в коде страницы? Из-за этого не могу найти div c нужным class через BeautifulSoup
Через DevTool в ответе отображается нормально: div class=“form-group”, а если смотреть код страницы и код при запросе через модуль Requests, то код выглядит уже так: div class=\“form-group\”, т.е. лишние слеши добавляются.
py.user.next
Приведи код страницы и код запроса в requests.
Klakk
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
py.user.next
Это код на языке 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
>>>
Klakk
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 выводятся с новой строки.

Не пойму почему так…
py.user.next
[code python]
все коды на форуме пиши в такой конструкции
[/code]

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

Только теги code используй, потому что движок форума у простого текста заменяет и стирает символы. Видишь код в белой рамке? Вот так же сделай со всеми своими фрагментами кода, чтобы код был в белой рамке.
Klakk
 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">
 
py.user.next
Надо подредактировать его после взятия через 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 уже.
Klakk
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(

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

Klakk
Может это скрытые символы или кодировка так влияет?
Нет.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB