Странные персонажи, когда мы трафаретничаем с помощью Beautiful Soup - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь вернуть html в виде строки с сайта интернет-магазина, но получаю странные символы.Когда я смотрю на веб-консоль, я не вижу этих символов в HTML.Я также не вижу этих символов, когда html отображается в кадре данных pandas в блокноте jupyter.Ссылка https://www.powerhousefilms.co.uk/collections/limited-editions/products/immaculate-conception-le. Я также использую тот же метод для другого продукта на этом веб-сайте, но вижу эти символы только на этой странице.На других страницах сайта такой проблемы нет.

html = requests.get(url).text
soup = BeautifulSoup(html)
elem = soup.find_all('div', {'class': product-single_description rte'})
s = str(elem[0])

s выглядит следующим образом:

    <div class="product-single__description rte">
<div class="product_description">
<div>
<div>
<div><span style="color: #000000;"><em>THIS ITEM IS AVAILABLE TO PRE-ORDER. PLEASE NOTE THAT YOUR PAYMENT WILL BE TAKEN IMMEDIATELY, AND THAT THE ITEM WILL BE DISPATCHED JUST BEFORE THE LISTED RELEASE DATE. </em></span></div>
<div><span style="color: #000000;"><em>Â </em></span></div>
<div><span style="color: #000000;"><em>SHOULD YOU ORDER ANY OF THEÂ ALREADY RELEASED ITEMS FROM OURÂ CATALOGUE AT THE SAME TIME AS THIS PRE-ORDER ITEM, PLEASE NOTE THATÂ YOUR PURCHASES WILL ALL BE SHIPPED TOGETHER WHENÂ THIS PRE-ORDERÂ ITEM BECOMES AVAILABLE.</em></span></div>
</div>
<div><span style="color: #38761d;">Â </span></div>
<div>
<strong>(Jamil Dehlavi, 1992)</strong><br/><em>Release date: 25 March 2019</em><br/>Limited Blu-ray Edition (World Blu-ray premiere)<br/><br/>A Western couple (played by Melissa Leo and James Wilby) working in Pakistan visit an unconventional holy shrine to harness its spiritual powers to help them conceive a child. They are lavished with the attentions of the shrine’s leader (an exceptional performance from Zia Mohyeddin – <em>Lawrence of Arabia</em>, <em>Khartoum</em>) and her followers, but their methods and motives are not all that they seem, and the couple’s lives are plunged into darkness.<br/><br/>This ravishing, unsettling film from director Jamil Dehlavi (<em>The Blood of Hussain</em>, <em>Born of Fire</em>) is a deeply personal work which raises questions of cultural and sexual identity, religious fanaticism and the abuses of power. The brand-new 2K restoration from the original negative was supervised and approved by Dehlavi and cinematographer Nic Knowland.<br/><br/><strong>INDICATOR LIMITED EDITION BLU-RAY SPECIAL FEATURES:</strong>
</div>
<div>
<ul>
<li>New 2K restoration by Powerhouse Films from the original negative, supervised and approved by director Jamil Dehlavi and cinematographer Nic Knowland</li>
<li>
<div>Original stereo audio</div>
</li>
<li>
<div>Alternative original mono mix</div>

Я попытался указать кодировку, но все еще получаю странные символы.Для 50+ продуктов на этом сайте только у немногих есть эта проблема.

Есть проблема с тем, как я очищаю или возможно легкий способ убрать это.

Спасибо

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Так что оказывается, что Excel был причиной этого.Когда я сохраняю в CSV и открываю в Excel, я получаю странные результаты.

Чтобы предотвратить это, я использовал df.to_csv('df.csv', index=False, encoding = 'utf-8-sig').Задание кодировки избавило от странных символов.

Python Writing Weird Unicode в CSV содержит некоторую информацию о кодировке и о том, как Excel взаимопроникает в CSV-файлы.

0 голосов
/ 11 февраля 2019

Используйте этот фрагмент кода для загрузки видимого содержимого на веб-странице.Просто вставьте URL в page_url

from bs4 import BeautifulSoup
from bs4.element import Comment
import urllib.request
import os


page_url = "URL Here"
def tag_visible(element):
    if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]']:
        return False
    if isinstance(element, Comment):
        return False
    return True


def text_from_html(body):
    soup = BeautifulSoup(body, 'html.parser')
    texts = soup.findAll(text=True)
    visible_texts = filter(tag_visible, texts)
    return u" ".join(t.strip() for t in visible_texts)

def Extract_Text(html_bytes, url):
    text_data = text_from_html(html_bytes)
    f = open("DOC.txt", "w")
    string = str(url) + "\n" + text_data
    f.write(str(string))
    f.close()

html_string = ''
response = urlopen(page_url)
if 'text/html' in response.getheader('Content-Type'):
    html_bytes = response.read()
    html_string = html_bytes.decode("utf-8")
Extract_Text(html_bytes, page_url)
...