Во-первых, я новичок, граничащий с Python на среднем уровне, поэтому, пожалуйста, будьте терпеливы с моим подходом к этой проблеме. Я работал над мини-проектом парсинга веб-страниц, используя lxml etree и запросы (код находится под этим абзацем). Я хотел очистить веб-сайт о текущем медиа-спектакле и решил использовать для практики ООП-способ (хотя я сомневаюсь, что этот способ подходит или вообще хорошо реализован, отзывы об этом были бы очень признательны), и поэтому я мог повторно использовать класс для очистки других страниц в том же скрипте. Именно тогда я заметил, что когда я пытался получить и распечатать текст из элементов <p> и <span> в методе get_stories(), '/xad' должен возникать часто и в странных местах. Я не смог найти в Интернете ничего конкретного для моей ситуации, но нашел кое-что, связанное с кодированием/декодированием и Юникодом, с которым я не слишком знаком. Может быть, существует проблема, связанная с кодированием/декодированием, когда необработанный HTML-код преобразуется в текстовый атрибут элемента? Но, как я уже сказал, это выше моего понимания, поэтому конструктивные отзывы о моем коде и моей проблеме будут очень признательны. Спасибо!
from lxml import etree
import requests
class Page:
headers = {"User-Agent" : "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"}
def __init__(self, url):
try:
self.html = requests.get(url, headers=Page.headers).text
self.tree = etree.HTML(self.html)
self.articles = dict()
self.var = None
except:
raise SystemExit("Invalid url")
def get_stories(self):
headers = [span.text for span in self.tree.xpath('//a[@class = "u-clickable-card__link"]//span')]
snippets = [span.text for span in self.tree.xpath('//div[@class = "gc__excerpt"]//p')]
print(headers)
url = "https://www.aljazeera.com/tag/julian-assange/"
page1 = Page(url)
page1.get_stories()
Вот результат:
['The Take: Что случится\xadpen с Джу\xadlian As\xadsange, если он ex\xadtra\xaddit\xaded?', 'Три\xadals Джу\xadlian As\xadsange: Смерть sen\xadtence для democ \xadra\xadcy', 'Американские юристы призывают британский суд заблокировать предложение Ju\xadlian As\xadsange ex\xadtra\xaddi\xadtion ap\xadpeal', 'Его\xadto\xadry Il\xadlus\xadtrat\xaded: Ju\xadlian Последний бой Ас\xadsange?', 'Основатель Wik\xadiLeaks Джу\xadlian As\xadsange делает фи\xadnal предложение избежать ex\xadtra\xaddi\xadtion США', 'Почему США хотят, чтобы Ju\xadlian As\xadsange ex \xadtra\xaddit\xaded?', 'Кто такой Джу\xadlian As\xadsange? Будет ли он экс\xadtra\xaddit\xaded в США?', ''Хватит': Премьер-министр Австралии\xadtralian объявляет о\xadtralian США, Великобритании le\xadgal Pur\xadsuit As\xadsange', 'Австралийский\xadtralian закон \xadmak\xaders press US en\xadvoy for Ju\xadlian As\xadsange re\xadlease', 'Что означает fu\xadture для Ju\xadlian As\xadsange?', 'Im\xadpris\xadon\xadment Ju \xadlian As\xadsange', 'Протесты в Чи\xadna: пустые листы рассказывают историю', 'Top me\xaddia out\xadlets de\xadmand США заканчивают плюсы\xade\xadcu\xadtion of Ju\xadlian As\xadsange' , 'В новой книге журналист\xadnal\xadist приводит доводы в пользу Ju\xadlian As\xadsange']






Шестнадцатеричный код 0xad, отображаемый в тексте как \xad, представляет собой кодовую точку Юникода для мягкого дефиса.
Это сделано для того, чтобы форматировщики могли легко определить, где можно поставить дефисы, если текст необходимо разделить. Например, отображение первой строки в списке на особенно тонком устройстве отображения:
The Take: What will happen to Ju-lian Assange if he is extradited?
Если вы хотите избавиться от них, вы можете использовать что-то вроде:
new_list = [item.replace("\xad", "") for item in old_list]
@intmainvoid, я даже не знаю. Я подозреваю, что они будут в исходном тексте, потому что компьютеру будет сложно или подвержено ошибкам разобраться в этом. Но тогда вы получите что-то вроде Wik-iLeaks, а это не то место, где я бы поставил мягкий дефис. Имейте в виду, что мягкие дефисы на самом деле предназначены для опционального отображения как настоящие дефисы (т. е. не все из них станут дефисами). Идея состоит в том, что вы просто переполняете строку, а затем возвращаетесь к последнему пробелу или мягкому дефису. Если это был мягкий дефис, вы ставите настоящий дефис. В любом случае вы начинаете рендеринг следующей строки.
Спасибо paxdiablo, я видел сообщения о мягких дефисах, но не ожидал их здесь. Так является ли «/xad» в текущем простом тексте строки, когда он закодирован UTF-8, или он должен был отображаться в виде мягкого дефиса?