Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
383 / 23 / 2
Регистрация: 12.06.2021
Сообщений: 211
Записей в блоге: 2

Как вместо символов и пробелов установить знак минус или нижнее подчеркивание?

03.12.2023, 06:41. Показов 2898. Ответов 39
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, я сделала парсер, чтобы собирать данные с сайта и заносить в файл csv. Парсер работает так он собирает ссылки, переходит по каждой из них и забирает title.
Перед сохранением нужно убрать лишние символы (лапки, елочки, точки и т.д.) и оставить только буквы. При этом заменить символы на “минус” или “нижнее подчеркивание” Для теста на php я сделала так.
PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
 
function encodestring($var, $punkt = true) {
    
    if ( is_array($var) ) return "";
 
    $var = trim( strip_tags( $var ) );
    $var = preg_replace( "/\s+/ms", "-", $var );
    $var = str_replace( "/", "-", $var );
 
    if ( $punkt ) $var = preg_replace( "/[^а-яА-Я0-9\_\-.]+/mi", "", $var );
    else $var = preg_replace( "/[^а-яА-Я0-9\_\-]+/mi", "", $var );
 
    $var = preg_replace( '#[\-]+#i', '-', $var );
    $var = preg_replace( '#[.]+#i', '-', $var );
 
    $var = str_ireplace( ".php", "", $var );
    $var = str_ireplace( ".php", ".ppp", $var );
 
    if( strlen( $var ) > 200 ) {
        
        $var = substr( $var, 0, 200 );
        
        if( ($temp_max = strrpos( $var, '-' )) ) $var = substr( $var, 0, $temp_max );
    
    }
    
    return $var;
}
$title = "Вышел WordPress 6.0 «Arturo» с новыми шаблонами и паттернами, а также переключателем стилей";
 
 
echo "<strong>До:</strong>-------->".$title."<br>";
echo "<strong>После:</strong> ---->".encodestring($title)."<br>";
 
 
?>
Результат на скриншоте:

А как сделать на python, сохранение title в csv без лишних символов?
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
print('Content-Type: text/html; charset=utf-8\n')
import csv
import requests
from bs4 import BeautifulSoup
 
host = 'https://oddstyle.ru'
max_pages = 1
max_post_per_page = 10
i = 0 
info_text = []
for page in range(1, max_pages+1):
    url = f'{host}/page/{page}'
    html = requests.get(url)
    soup = BeautifulSoup(html.content, "html.parser")
    posts = soup.select('article.post-box.type-post') #класс находится в одном контейнере
    for idx, post in enumerate(posts, 1):
      href = post.select_one('header h2 a').attrs.get("href")
      post_req = requests.get(href)
      post_soup = BeautifulSoup(post_req.content, "html.parser")
      title = post_soup.select_one('article header h1').text
      print(title)
     
      info_text.append({"title":title,"link":href})
      i+=1
      print(f"Post= {i}")
      if i == max_pages*max_post_per_page:
        with open(f"data1/data1.csv","w") as file:
          writer = csv.writer(file, delimiter=' ',
                            quotechar='|', quoting=csv.QUOTE_MINIMAL)
          for t in info_text:
            link = t["link"]
            title = t["title"]
            #print(t)
            writer.writerow(
                {
                  title,link
                }
          )
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.12.2023, 06:41
Ответы с готовыми решениями:

Процедура Replace(S): замена в строке S пробелов на нижнее подчеркивание
Описать процедуру Replace(S), заменяющую в строке S пробелы на нижнее подчеркивание. Используя эту процедуру, преобразовать пять данных...

Верблюжий регистр или нижнее подчёркивание?
Здравствуйте уважаемые форумчане, дайте пожалуйста совет как быть. Я всё чаще и чаще с растущей популярности c# стал замечать, что стиль...

Как убрать нижнее подчёркивание?
Как убрать нижнее подчёркивание в теге

39
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
11.12.2023, 10:13
Студворк — интернет-сервис помощи студентам
YuS_2, вообщем-то работает, а как объединить в одно условие три "not"?
Python
1
2
3
4
5
6
7
for idx4, figure3 in enumerate(figures2, 1):
 if figure3 not in figures:
  figure3.decompose()
 if figure3 not in avt:
  figure3.decompose()
 if figure3 not in figures3:
  figure3.decompose()
Потому, что так вот так все равно все чистит, а если одно условие, то работает.
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
11.12.2023, 14:30
Цитата Сообщение от Katerina1993 Посмотреть сообщение
как объединить в одно условие три "not"?
самый простой вариант:
Python
1
2
if figure3 not in figures and figure3 not in avt and figure3 not in figures3:
...
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
11.12.2023, 21:43
YuS_2, пытаюсь выбрать прикрепленные файлы пользователей контейнеры div, там где img, но так получилось что в одном контейнере два img и даже нету класса за что можно зацепить. Вот как взять только первый img в двух контейнерах из массива которые удалось отобрать, но нужно сделать так чтобы эти первые img оказались так же в массиве, чтобы можно было их через цикл пропустить? Вообщем вот пример.
Python
1
2
find_all_div1 = article.find_all(class_="attachments smalltext")
print(find_all_div1)
А вот результат с сайта:
http://animalist.pro/index.php/topic,4052.0.html
[<div class="attachments smalltext" id="msg_72461_footer">
<div style="overflow: auto;">
<img alt="" height="600" src="http://animalist.pro/index.php?PHPSESSID=44d4e7bc899a4e7670dd 08d8ec005477&amp;action=dlattach;topic=4 052.0;attach=3398;image" width="900"/><br/>
<a href="http://animalist.pro/index.php?PHPSESSID=44d4e7bc899a4e7670dd 08d8ec005477&amp;action=dlattach;topic=4 052.0;attach=3398"><img align="middle" alt="*" src="http://animalist.pro/Themes/AAP-2014-03/images/icons/clip.gif"/> голова орла.jpg</a>
(277.14 КБ, 900x600 - просмотрено 1348 раз.)<br/>
</div>
</div>, <div class="attachments smalltext" id="msg_76335_footer">
<div style="overflow: auto;">
<img alt="" height="966" src="http://animalist.pro/index.php?PHPSESSID=44d4e7bc899a4e7670dd 08d8ec005477&amp;action=dlattach;topic=4 052.0;attach=5148;image" width="900"/><br/>
<a href="http://animalist.pro/index.php?PHPSESSID=44d4e7bc899a4e7670dd 08d8ec005477&amp;action=dlattach;topic=4 052.0;attach=5148"><img align="middle" alt="*" src="http://animalist.pro/Themes/AAP-2014-03/images/icons/clip.gif"/> image.jpg</a>
(198.39 КБ, 900x966 - просмотрено 1053 раз.)<br/>
</div>
</div>]
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
12.12.2023, 09:42
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Вот как взять только первый img в двух контейнерах из массива которые удалось отобрать, но нужно сделать так чтобы эти первые img оказались так же в массиве, чтобы можно было их через цикл пропустить?
Вам надо подробнее почитать документацию на bs4...
Цитата Сообщение от Katerina1993 Посмотреть сообщение
find_all_div1
Первый элемент:
Python
1
find_all_div1[0]
Или:
Если класс у элементов одинаковый и их несколько, а требуется только первый, то использовать метод не .find_all, а .find
Python
1
2
find_div1 = article.find(class_="attachments smalltext")
print(find_div1)
- то же самое используйте и для картинок...
Или если таки требуются все, а потом среди них необходимо выбирать по какому-то признаку, то выбираете все .find_all, а потом в цикле делайте разбор с условием...
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
12.12.2023, 11:44
YuS_2,
Или если таки требуются все, а потом среди них необходимо выбирать по какому-то признаку,
В этом вся и проблема что не получится по какому-то признаку img одинаковы у них даже классов нет. Я хотела сделать так, сначала отобрать контейнеры через find_all и выделить от туда первый элемент img в каждом контейнере и поместить в массив, а потом через цикл перебирать.
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
12.12.2023, 14:21
Цитата Сообщение от Katerina1993 Посмотреть сообщение
отобрать контейнеры через find_all и выделить от туда первый элемент img в каждом контейнере
Цитата Сообщение от YuS_2 Посмотреть сообщение
Первый элемент:
Python
1
find_all_div1[0]
Так?

Добавлено через 51 секунду
Не совсем понимаю, в чем проблема.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
13.12.2023, 13:08
YuS_2, дело в том, что условия проверки на Img не срабатывала и все картинки аватарки и прикрепленные файлы пользователей удалялись, когда срабатывало это условие(кроме в основном посте)
Python
1
2
if figure3 not in figures and figure3 not in avt and figure3 not in figures3:
...
Я стала проверять в чем дело. Посмотрев содержимое каждого выбранного элемента я поняла что единственное где выбираются img это в статье, в комментариях и аватарки выбираются контейнеры.

Задумка была такая, выбрать только картинки, но проблема заключалась в том что в одном контейнере две картинки и нет классов, чтобы зацепиться. Мне нужно была только одна картинка(первая), а контейнеров два, т.е. из каждого div выбрать только первую картинку, вывести их в массив, а потом через условия(пример выше) сравнивать. Выход я нашла, Выбираю контейнеры пропускаю через цикл и первую картинку записываю в массив через append, а потом сравниваю через условие(пример выше).

Итак
Python
1
2
img3.append(img2) #приатаченные картинки пользователей
avt3.append(img) #аватарки пользователей.
Сравнение условие
Python
1
2
3
for idx4, figure3 in enumerate(figures2, 1):
  if figure3 not in figures and figure3 not in avt3 and figure3 not in img3:
    figure3.decompose()
Теперь работает. Полностью код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import requests
from bs4 import BeautifulSoup
import os
 
url = "http://animalist.pro/index.php/topic,2074.0.html"
 
headers = {
  "Accept":"*/*",
  "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
}
 
req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text, "lxml")
article = soup.select_one('div#forumposts')
figures = article.select('.linked-image')
avt = article.select('li.avatar')
figures2 = article.select('img')
figures3 = article.select('div.attachments.smalltext')
 
#print(figures3)
 
#find_all_razdel_game = article.find_all(class_="attachments smalltext")
#.find_all("td")
 
 
title1 = soup.find("title")
 
print(figures3)
 
#извлекаем прикрепленные картинки автора поста(статьи) и сохраняем их в папку(пути заменяем на те которые в папке)
for idx, figure in enumerate(figures, 1):
    try:
       img = figure.attrs.get('src')
       image_data = requests.get(img)
       f_path = f'animalist/images/img{idx}.jpg'
       with open(f_path, 'wb') as f:
        f.write(image_data.content)
       figure.attrs['src'] = f'images/img{idx}.jpg'
    except:
       #print(figure)
       figure.decompose()
       print('Ошибка файла:', img)
       continue
   
#извлекаем аватарки пользователей и сохраняем их в папку(пути заменяем на те которые в папке)
avt3 = []
 
for idx2, avt2 in enumerate(avt, 1):
  try:
     img = avt2.select_one('img')
     avt3.append(img)
     link = img.attrs.get('src')
     filename = os.path.basename(link) 
     avt_data = requests.get(link)
     f_path = f'animalist/images/{filename}'
  
     with open(f_path, 'wb') as f:
        f.write(avt_data.content)
     img.attrs['src'] = f'images/{filename}'
  except:
     img.decompose()
     print('Ошибка файла:', link)
     continue
img3 = []
#извлекаем прикрепленные картинки пользователей и сохраняем их в папку(пути заменяем на те которые в папке)
for idx3, figure3 in enumerate(figures3, 1): 
  try:
    img2 = figure3.select_one('img')
   
    link2 = img2.attrs.get('src')
    img3.append(img2)
    image_data2 = requests.get(link2)
    f_path2 = f'animalist/images/attch_img{idx3}.jpg'
  
    with open(f_path2, 'wb') as f:
       f.write(image_data2.content)
    img2.attrs['src'] = f'images/attch_img{idx3}.jpg'
  except:
     img2.decompose()
     print('Ошибка файла:', link)
     continue
 
 
#figures = article.select('.linked-image')
#avt = article.select('li.avatar')
#figures3 = article.select('div.attachments.smalltext')
  
for idx4, figure3 in enumerate(figures2, 1):
  if figure3 not in figures and figure3 not in avt3 and figure3 not in img3:
    figure3.decompose()
 
 
 
 
html = f"""<!DOCTYPE html> 
<html lang="en" >
<head>
  <link rel="stylesheet" type="text/css" href="style.css" />
  <meta charset="UTF-8">
  {title1}
</head>
<body>
{article}
</body>
 
</html>
"""
 
with open('animalist/main.html', 'w') as f:
    f.write(html)
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
20.12.2023, 15:42
YuS_2, думала, теперь удастся извлечь несколько статей, но на некоторых постах используется другие теги для вложения картинок, т.е. “.linked-image” отсутствует и выборку из-за этого не получается сделать.

Тогда я решила вот так записать.

Python
1
2
3
4
5
6
7
figures = article.select('.linked-image')
#.inner – класс поста
if not figures:
  figures = article.select('.inner')
  for idx, figure4 in enumerate(figures, 1):
     img11 = figure4.select_one('img')
     print(img11)
Вот пример тега который я пытаюсь получить.
HTML5
1
<img src="http://animalist.pro/index.php?action=dlattach;topic=8540.0;attach=6255;image" alt="" title="Взгляд молчаливого пса. Рисунок углём." id="thumb_6255-5" style="width:650px;border:0;">
Класса здесь нет, зато есть id="thumb_6255-5", разумеется 6255-5 уникальный (для каждой картинки свой).

Как получить картинки, например через select_one(или аналогичный) где есть id и идентификатор который начинается с “ thumb_” без цифр, может быть использовать какое-нибудь регулярное выражение (похожее на php, только на python) или маску?

Вот пример поста: http://animalist.pro/index.php/topic,6080.0.html, который надо извлечь.
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
20.12.2023, 17:25
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Вот пример поста
Ссылка ведет не на то, что требуется выбрать... но суть вопроса понятна.
Например, можно сделать так:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import re
import requests
from bs4 import BeautifulSoup
 
def srch_thumb(tag):
    return tag and re.compile("^thumb").search(id)
 
url = "http://animalist.pro/index.php/topic,8540.0.html"
 
headers = {
  "Accept":"*/*",
  "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
}
 
req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text, "lxml")
 
figures = soup.find_all('img', id=srch_thumb)
 
print(*figures, sep='\n')
Функция возвращает True, при выполнении определенных условий. Сама функция может иметь какую угодно сложность.
По сути, в данном варианте, метод .find_all('name', id=func) ищет теги 'name' с атрибутом id, значение которого, в свою очередь, проверяется в функции func(), а уже в самой функции работает регэксп.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
20.12.2023, 17:41
YuS_2, почему-то ошибки выводит.

Traceback (most recent call last):
File "python1/main.py", line 23, in <module>
figures = soup.find_all('img', id=srch_thumb)
File "/.local/lib/python3.6/site-packages/bs4/element.py", line 1868, in find_all
return self._find_all(name, attrs, text, limit, generator, **kwargs)
File "/.local/lib/python3.6/site-packages/bs4/element.py", line 825, in _find_all
found = strainer.search(i)
File "/.local/lib/python3.6/site-packages/bs4/element.py", line 2145, in search
found = self.search_tag(markup)
File "/.local/lib/python3.6/site-packages/bs4/element.py", line 2108, in search_tag
if not self._matches(attr_value, match_against):
File "/.local/lib/python3.6/site-packages/bs4/element.py", line 2177, in _matches
return match_against(markup)
File "python1/main.py", line 9, in srch_thumb
return tag and re.compile("^thumb").search(id)
TypeError: expected string or bytes-like object



Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import re
import requests
from bs4 import BeautifulSoup
 
def srch_thumb(tag):
    return tag and re.compile("^thumb").search(id)
 
url = "http://animalist.pro/index.php/topic,8540.0.html"
 
headers = {
  "Accept":"*/*",
  "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
}
 
req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text, "lxml")
 
 
 
figures = soup.find_all('img', id=srch_thumb)
 
print(*figures, sep='\n')
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
20.12.2023, 17:49
Цитата Сообщение от Katerina1993 Посмотреть сообщение
почему-то ошибки выводит
А, да, забыл поправить...
Вот здесь:
Цитата Сообщение от Katerina1993 Посмотреть сообщение
return tag and re.compile("^thumb").search(id)
надо id изменить на tag
1
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
20.12.2023, 21:04
YuS_2, работает выборка контейнеров, через ID.

Как сделать сжатие файлов перед скачиванием. Я заметила, что некоторые файлы занимают очень много места, у некоторых размер достигает 380кб. Можно перед скачиваниям их сжать(в процентах, без потери качества)?
Вот например в одной программе, с помощью ползунка можно уменьшить размер.



Также сделать "компрессинг" только через Python?

Простой пример скачивания файла:
Python
1
2
3
4
5
6
7
8
9
10
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests
 
img = 'http://animalist.pro/images/uploads_old/monthly_12_2011/post-9-1322805158.jpg'
image_data = requests.get(img)
idx = 1
f_path = f'animalist/images/img{idx}.jpg'
with open(f_path, 'wb') as f:
  f.write(image_data.content)
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
21.12.2023, 13:30
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Как сделать сжатие файлов перед скачиванием.
Скорее всего, никак. Для небольшого ускорения скачивания, имеет смысл сжимать только на стороне сервера, но для этого, он должен "уметь" выполнять команды от клиента, что вряд ли реализовано...

Цитата Сообщение от Katerina1993 Посмотреть сообщение
очень много места, у некоторых размер достигает 380кб.
Это небольшие размеры, по современным меркам...
А сжимать "без потери качества"... этим уже занимаются специализированными программы... да и вряд ли, это без реальных потерь происходит.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
21.12.2023, 16:26
YuS_2,
Скорее всего, никак. Для небольшого ускорения скачивания, имеет смысл сжимать только на стороне сервера, но для этого, он должен "уметь" выполнять команды от клиента, что вряд ли реализовано...
Понятно придется тогда писать программу на delphi, чтобы получить все файлы jpg из папок, автоматически сжимать их а потом перезаписывать. Как-нибудь позже займусь. Просто думала, что на Python есть какая-нибудь библиотека.
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
21.12.2023, 20:47
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Просто думала, что на Python есть какая-нибудь библиотека.
Да библиотека-то, скорее всего, есть, но стоит ли овчинка выделки? Ради сотни-другой килобайт, ужимать уже скачанные картинки, которые и так достаточно пожаты уже...
Библиотеки можно поискать в сети... вот, например, Pillow...
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
21.12.2023, 23:05
YuS_2,

Да библиотека-то, скорее всего, есть, но стоит ли овчинка выделки? Ради сотни-другой килобайт, ужимать уже скачанные картинки, которые и так достаточно пожаты уже...
Понятно если нужно будет больше сделать компрессинг воспользуюсь Delphi или какой-нибудь программой .

Интересно, а ссылки вытащить через select или find_all возможно ориентируясь только по get-параметрам. Вот например вытащить все ссылки где есть параметр "act" со значением "Attach"?

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import requests
from bs4 import BeautifulSoup
 
html = '''<!DOCTYPE html> 
<html lang="en" >
<head>
  <link rel="stylesheet" type="text/css" href="style.css" />
  <meta charset="UTF-8">
  Привет
</head>
<body>
<div>
   <div>
   <a href="https://site.ru/forum/index.php?act=Attach&type=post&id=1">Скачать</a>
   </div>
   <div>
   <a href="https://site.ru/forum/index.php?act=Attach&type=post&id=2">Скачать</a>
   </div>
   <div>
   <a href="https://site.ru/forum/index.php?act=Attach&type=post&id=3">Скачать</a>
   </div>
</div>
</body>
</html>
'''
soup = BeautifulSoup(html)
 
print("-------------------------")
print(soup)
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
22.12.2023, 19:07
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Вот например вытащить все ссылки где есть параметр "act" со значением "Attach"?
Python
1
2
import re
hrfatt = soup(href=re.compile(r'act=Attach'))
Добавлено через 2 минуты
можно даже с уточнением:
Python
1
hrfatt = soup(href=re.compile(r'\bact=Attach\b'))
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
23.12.2023, 21:43
YuS_2,
Я пытаюсь из сохраненных документов сделать справку. Использую для этого программу “NATATA ebook Compiler” В итоге оглавления текста превращается в "кракозябры". Сам текст при открытии на русском языке.


Исправить ситуацию можно если через блокнот изменить кодировку в ручную на кириллицу, но у меня сотни документов я не могу их все в ручную менять. Другой вариант, при сохранении использовать 1251.
Python
1
2
with open(f'animalist/{out}.html', 'w', encoding='cp1251') as f:
          f.write(html)
В этом случае заголовки становятся нормальными, а вот текст при компиляции и открытии "exe файла" превращается в квадратики и становится не читаемым. Как быть подскажите пожалуйста? Но все перепробовала.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import re
import os
import requests
from bs4 import BeautifulSoup
 #https://sky.pro/media/sravnenie-if-x-is-not-none-i-if-not-x-is-none-v-python/
 #https://stackoverflow.com/questions/55951778/if-not-img-none-valueerror-the-truth-value-of-an-array-with-more-than-one-ele
def srch_thumb(tag):
    return tag and re.compile("^thumb").search(tag)
 
url = "http://animalist.pro/index.php/topic,4052.0.html"
 
#http://animalist.pro/index.php/topic,8540.0.html - как нарисовать молчаливого пса
#http://animalist.pro/index.php/topic,4052.0.html - как нарисовать голову орла
 
headers = {
  "Accept":"*/*",
  "User-Agent": "Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36"
}
 
req = requests.get(url, headers=headers)
soup = BeautifulSoup(req.text, "lxml")
 
 
article = soup.select_one('div#forumposts') 
 
avt = article.select('li.avatar')
figures2 = article.select('img')
 
 
figures = article.select('.linked-image')
 
if not figures:
  figures = article.find_all('img', id=srch_thumb)
 
 
figures3 = article.select('div.attachments.smalltext') 
#print(*figures, sep='\n')
 
title1 = soup.find("title")
 
 
 
for idx, figure in enumerate(figures, 1):
 #print(item)
  try:
    img = figure.attrs.get('src')
    print(img)
    image_data = requests.get(img)
    f_path = f'animalist/images/img{idx}.jpg'
    with open(f_path, 'wb') as f:
      f.write(image_data.content)
    figure.attrs['src'] = f'images/img{idx}.jpg'
   # print(img)
  except:
       #print(figure)
       figure.decompose()
       print('Ошибка файла:', img)
       continue
 
avt3 = []
 
for idx2, avt2 in enumerate(avt, 1):
  try:
     img = avt2.select_one('img')
     
     avt3.append(img)
     link = img.attrs.get('src')
     
     filename = os.path.basename(link) 
     avt_data = requests.get(link)
     
     f_path = f'animalist/images/{filename}'
  
     with open(f_path, 'wb') as f:
        f.write(avt_data.content)
     img.attrs['src'] = f'images/{filename}'
  except:
     img.decompose()
     print('Ошибка файла:', link)
     continue
 
 
       
img3 = []
#извлекаем прикрепленные картинки пользователей и сохраняем их в папку(пути заменяем на те которые в папке)
for idx3, figure3 in enumerate(figures3, 1): 
  try:
    img2 = figure3.select_one('img')
    if img2 is not None:
      print("img3")
      print(img2)
      link2 = img2.attrs.get('src')
      img3.append(img2)
      image_data2 = requests.get(link2)
      f_path2 = f'animalist/images/attch_img{idx3}.jpg'
    
      with open(f_path2, 'wb') as f:
         f.write(image_data2.content)
      img2.attrs['src'] = f'images/attch_img{idx3}.jpg'
  except:
     img2.decompose()
     print('Ошибка файла:', link)
     continue
 
#print(figures3)
 
#извлекаем прикрепленные картинки пользователей и сохраняем их в папку(пути заменяем на те которые в папке)
 
for idx4, figure3 in enumerate(figures2, 1):
  if figure3 not in figures and figure3 not in avt3 and figure3 not in img3:
    figure3.decompose()
 
       
html = f"""<!DOCTYPE html> 
<html lang="en" >
<head>
  <link rel="stylesheet" type="text/css" href="style.css" />
  <meta charset="UTF-8">
  {title1}
</head>
<body>
{article}
</body>
 
</html>
"""
with open('animalist/main1.html', 'w') as f:
   f.write(html)
0
Любознательный
 Аватар для YuS_2
7407 / 2260 / 361
Регистрация: 10.03.2016
Сообщений: 5,216
25.12.2023, 10:03
Цитата Сообщение от Katerina1993 Посмотреть сообщение
Как быть подскажите пожалуйста?
Ну, очевидно, что "NATATA ebook Compiler" - устаревшая программа, которая "не умеет" корректно работать с unicode.
Разбор этой ситуации уже выходит за рамки питона... попробуйте обсудить эту программу в более подходящих разделах.
0
403 / 19 / 5
Регистрация: 17.01.2017
Сообщений: 572
25.12.2023, 13:37
YuS_2, я кое что изменила при создании eBook у меня теперь все нормально. Можете посмотреть файл как получилось https://disk.yandex.ru/d/w7RwxunhpR_Tvw? Нормально отображается русский язык?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
25.12.2023, 13:37

Как сделать нижнее подчеркивание у псевдоэлемента
.main:after { content:&quot;&quot;; border-bottom:5px solid crimson; } вот небольшой код, чтобы сделать нижнее подчеркивание...

Как сделать что бы вместо пробелов между словами ставился знак '+' ?
Как сделать что бы вместо пробелов между словами в Edit`е ставился знак '+'?Пытался сам придумать какой-то способ, но в голову пока ничего...

Как убрать нижнее подчеркивание с последней строки
Не могу убрать нижнее подчеркивание с последней строки как убрать? На каждый вопрос создавайте по одной теме! (Правила п.4.4)

Как вставить нижнее подчёркивание по ширине блока после <h1>
Доброго времени суток! Очень нуждаюсь в Вашей помощи. Проблема в следующем - это только картинкой можно описать :) Нужно сделать черту...

Как установить ширину поля 10 символов ,точность 6 цифр и вместо пропусков установить символ подчеркивания?
Доброго времени суток! Есть вот код программы которая записывает данные в файл о температуре в Градусах Цельсия, выводит их на экран,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru