Vinnaren i pepparkakshustävlingen!
2017-07-21, 10:59
  #1
Medlem
user3815276s avatar
Kod:
import requests
from bs4 import BeautifulSoup

url = "https://www.flashback.org/t2857191"
request = requests.get(url)
source = request.text

soup = BeautifulSoup(source, "html.parser")

post_div = soup.find("div", class_="post")

post_message = post_div.find("div", class_="post_message")
post_message = post_message.get_text()

print(post_message)

Jag försöker använda den där koden för att hämta det första inlägget från en tråd här på forumet och sedan printa ut inlägget i terminalen jag kör scriptet från.

Inlägget visas, men vissa av tecknen har blivit ersatta av fyrkanter med text/siffror inuti.

Vet någon varför det här händer? Varför visas inte vissa av tecknen?

Det verkar vara double quote och något em/en tecken som inte visas. Testat med både Python 2.7 och 3.5, ingen skillnad.
Citera
2017-07-21, 12:19
  #2
Medlem
user3815276s avatar
Kod:
0013070: 7665 7220 6174 7420 6465 2074 7973 7461  ver att de tysta
0013080: 7473 206e 6564 2e3c 6272 3e0a 3c62 723e  ts ned.<br>.<br>
0013090: 0ae2 809d 4465 7420 7661 7220 6574 7420  ....Det var ett 
00130a0: 616e 7461 6c20 666c 6572 2073 6f6d 2076  antal fler som v
00130b0: 696c 6c65 2073 746f 7070 6120 6465 7474  ille stoppa dett
00130c0: 6120 6d65 6e20 736f 6d20 626c 6576 2062  a men som blev b
00130d0: 656f 7264 7261 6465 2061 7474 2068 c3a5  eordrade att h..
00130e0: 6c6c 6120 6bc3 a466 7465 6ee2 809d 2c20  lla k..ften..., 

Citat:
U+201D ” e2 80 9d RIGHT DOUBLE QUOTATION MARK

Right double quotation mark heter tecknet tydligen, men varför syns det inte?

Någon annan som kan köra scriptet och se om det blir samma resultat?
__________________
Senast redigerad av user3815276 2017-07-21 kl. 12:22.
Citera
2017-07-21, 13:01
  #3
Moderator
Protons avatar
Citat:
Ursprungligen postat av user3815276
Kod:
import requests
from bs4 import BeautifulSoup

url = "https://www.flashback.org/t2857191"
request = requests.get(url)
source = request.text

soup = BeautifulSoup(source, "html.parser")

post_div = soup.find("div", class_="post")

post_message = post_div.find("div", class_="post_message")
post_message = post_message.get_text()

print(post_message)

Jag försöker använda den där koden för att hämta det första inlägget från en tråd här på forumet och sedan printa ut inlägget i terminalen jag kör scriptet från.

Inlägget visas, men vissa av tecknen har blivit ersatta av fyrkanter med text/siffror inuti.

Vet någon varför det här händer? Varför visas inte vissa av tecknen?

Det verkar vara double quote och något em/en tecken som inte visas. Testat med både Python 2.7 och 3.5, ingen skillnad.
Låter precis som ett teckenkodningsproblem, en mismatch mellan det du hämtar hem, kontra det din terminal använder sig av.

Kolla vad du får tag i för teckenkodning och se till att din utskrift blir samma teckenkodning som din terminal har.
Citera
2017-07-21, 14:03
  #4
Medlem
user3815276s avatar
Källkoden för Flashback-sidan säger:
Citat:
<meta charset="ISO-8859-1">
Lägger man till print(request.encoding) i slutet av scriptet får man också:
Citat:
ISO-8859-1
Det här fick jag veta av Python:
Citat:
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.stdout.encoding
'UTF-8'
>>>
Citera
2017-07-21, 14:15
  #5
Medlem
user3815276s avatar
Ändrar jag sista raden för att försöka koda om ISO-8859-1 till UTF-8 så får jag det här meddelandet:
Citat:
Traceback (most recent call last):
File "test.py", line 17, in <module>
print(post_message.decode('latin1').encode('utf8') )
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 14: ordinal not in range(128)
Citera
2017-07-21, 17:52
  #6
Medlem
user3815276s avatar
Kod:
post_message = post_message.replace(u"\x96", "")
post_message = post_message.replace(u"\x94", "")

Inga fancy double quotes, men inga fyrkanter i texten heller.
Citera
2017-07-21, 18:36
  #7
Medlem
Citat:
Ursprungligen postat av user3815276
Ändrar jag sista raden för att försöka koda om ISO-8859-1 till UTF-8 så får jag det här meddelandet:
Det ser inte ut som om du försöker koda om Iso8859 till UTF8 när jag läser det meddelandet.
Det ser ut som om du försöker kod om till 7 bitars ascii till UTF8 ..

Ser ju också helt fel ut när jag tittar på din kod.. "latin1" är INTE samma sak som iso-8859-1
EDIT:
decode('iso-8859-1').encode('utf8') Kan nog få med å och ö
__________________
Senast redigerad av sagonar 2017-07-21 kl. 18:49. Anledning: Ge exempel på decode
Citera
2017-07-21, 21:10
  #8
Medlem
user3815276s avatar
Citat:
Ursprungligen postat av sagonar
Ser ju också helt fel ut när jag tittar på din kod.. "latin1" är INTE samma sak som iso-8859-1
Yes! Bra där!

Tittade på Wikipedia-sidan för ISO/IEC 8859-1 nu, och såg bland annat det här:

Citat:
It is very common (on the Internet) to mislabel Windows-1252 text with the charset label ISO-8859-1. A common result was that all the quotes and apostrophes (produced by "smart quotes" in word-processing software) were replaced with question marks or boxes on non-Windows operating systems, making text difficult to read. Most modern web browsers and e-mail clients treat the media type charset ISO-8859-1 as Windows-1252 to accommodate such mislabeling. This is now standard behavior in the HTML5 specification, which requires that documents advertised as ISO-8859-1 actually be parsed with the Windows-1252 encoding.[1]

Lade till request.encoding = "Windows-1252" där i början av scriptet och nu ser jag alla tecken! Tack för hjälpen!

Fungerande kod:

Kod:
import requests
from bs4 import BeautifulSoup

url = "https://www.flashback.org/t2857191"
request = requests.get(url)
request.encoding = "Windows-1252"
source = request.text

soup = BeautifulSoup(source, "html.parser")

post_div = soup.find("div", class_="post")

post_message = post_div.find("div", class_="post_message")
post_message = post_message.get_text()

print(post_message)
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback