如何使用 beautifulsoup 从网页中提取乌尔都语文本
How to extract Urdu text from a webpage using beautifulsoup
我正在使用 bs4 从网络文档中提取文本。但是它的输出很奇怪。喜欢
Ú©Ø¨Ú¾Û ÛÛ Ø¨Ø§Øª Ø³ÙØ¬Ú¾ ÙÛÚº ÙÛ Ø§ÙØªÛ تھÛÛ Ù¾Ú¾Ø± اÙÛØ³ØªÛ اÙÛØ³ØªÛ جب Ú©ÚÚ¾ عÙ٠اÙÙÛ Ø´Ø±ÙØ¹ ÛÙØ¦Û ت٠بات Ú©ÚÚ¾ Ù¾ÙÛ Ù¾ÚÛÛÙÛک٠اب ÛÛ Ø¨Ø§Øª Ø§ÛØ³Û Ø³ÙØ¬Ú¾ ÙÛÚº Ø§ÙØ¦Û Ú©Û Ø³ÙÚØ§ اÙÙ¾ Ú©ÛÙÙÚ¯ÙÚº Ú©Û Ø¨Ú¾Û Ø´ÛØ¦Ø± کرÙÚºÛ ÚÙØ¯ Ø±ÙØ² ÙØ¨Ù ÙÛØ±Ø§ 8 Ù
我认为这是某种编码。我是 bs4 的新用户。请指导我如何解码它以显示为乌尔都语文本。
Here 是我要提取其标题的文档源
我正在使用以下代码。
from bs4 import BeautifulSoup
import urllib2
import requests
url="http://blog.jang.com.pk/blog_details.asp?id=11058"
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data,'lxml')
print str(soup.title)
我认为发生的事情是网站响应中有一些格式错误的 Unicode:
----> 1 r.content.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd8 in position 1106: invalid continuation byte
因此使用 ANSI
编解码器对文本进行解码,这显然是错误的。您可以通过使用选项 errors='ignore'
调用解码来解决此问题(我们使用 content
而不是 text
因为这是来自网站的原始二进制响应:
data = r.content.decode(errors='ignore')
soup = BeautifulSoup(data,'lxml')
print (str(soup.title))
<title>کچھ توجہ اس طرف بھی!</title>
如果您只是尝试打印字符串,您会得到乱码:
>>> import requests
>>> from bs4 import BeautifulSoup as bs4
>>> r = requests.get('http://blog.jang.com.pk/blog_details.asp?id=11058')
>>> s = bs4(r.text, 'lxml')
>>> print s.title.text
Ú©ÚÚ¾ ØªÙØ¬Û اس طر٠بھÛ!
您需要正确地编码它,因为结果是一个 unicode 字节串。
>>> print s.title.text.encode('iso-8859-1')
کچھ توجہ اس طرف بھی!
如果它正确显示字形,但顺序错误(即,它们不是从右到左),那么这是您的操作问题 system/terminal/shell/program 您正在使用 运行 应用程序。
以上来自 gnome-terminal,它不正确支持阿拉伯语 RTL。
如果我 运行 在 mlterm 中使用相同的代码:
白框在那里是因为我使用的是阿拉伯语字体,它没有乌尔都语中的所有字符。
Burhan Khalid 的回答有效,但因为原始网页是用 utf-8 编码的:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
您应该更新请求的响应字段以匹配原始页面的编码:
from bs4 import BeautifulSoup
import urllib2
import requests
url="http://blog.jang.com.pk/blog_details.asp?id=11058"
r = requests.get(url)
# Update encoding to match source
r.encoding = "utf-8"
data = r.text
soup = BeautifulSoup(data,'lxml')
print str(soup.title)
现在您访问的任何字段都将具有正确的编码,而不必在每个字段的基础上设置为乌尔都语。
我正在使用 bs4 从网络文档中提取文本。但是它的输出很奇怪。喜欢
Ú©Ø¨Ú¾Û ÛÛ Ø¨Ø§Øª Ø³ÙØ¬Ú¾ ÙÛÚº ÙÛ Ø§ÙØªÛ تھÛÛ Ù¾Ú¾Ø± اÙÛØ³ØªÛ اÙÛØ³ØªÛ جب Ú©ÚÚ¾ عÙ٠اÙÙÛ Ø´Ø±ÙØ¹ ÛÙØ¦Û ت٠بات Ú©ÚÚ¾ Ù¾ÙÛ Ù¾ÚÛÛÙÛک٠اب ÛÛ Ø¨Ø§Øª Ø§ÛØ³Û Ø³ÙØ¬Ú¾ ÙÛÚº Ø§ÙØ¦Û Ú©Û Ø³ÙÚØ§ اÙÙ¾ Ú©ÛÙÙÚ¯ÙÚº Ú©Û Ø¨Ú¾Û Ø´ÛØ¦Ø± کرÙÚºÛ ÚÙØ¯ Ø±ÙØ² ÙØ¨Ù ÙÛØ±Ø§ 8 Ù
我认为这是某种编码。我是 bs4 的新用户。请指导我如何解码它以显示为乌尔都语文本。
Here 是我要提取其标题的文档源
我正在使用以下代码。
from bs4 import BeautifulSoup
import urllib2
import requests
url="http://blog.jang.com.pk/blog_details.asp?id=11058"
r = requests.get(url)
data = r.text
soup = BeautifulSoup(data,'lxml')
print str(soup.title)
我认为发生的事情是网站响应中有一些格式错误的 Unicode:
----> 1 r.content.decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd8 in position 1106: invalid continuation byte
因此使用 ANSI
编解码器对文本进行解码,这显然是错误的。您可以通过使用选项 errors='ignore'
调用解码来解决此问题(我们使用 content
而不是 text
因为这是来自网站的原始二进制响应:
data = r.content.decode(errors='ignore')
soup = BeautifulSoup(data,'lxml')
print (str(soup.title))
<title>کچھ توجہ اس طرف بھی!</title>
如果您只是尝试打印字符串,您会得到乱码:
>>> import requests
>>> from bs4 import BeautifulSoup as bs4
>>> r = requests.get('http://blog.jang.com.pk/blog_details.asp?id=11058')
>>> s = bs4(r.text, 'lxml')
>>> print s.title.text
Ú©ÚÚ¾ ØªÙØ¬Û اس طر٠بھÛ!
您需要正确地编码它,因为结果是一个 unicode 字节串。
>>> print s.title.text.encode('iso-8859-1')
کچھ توجہ اس طرف بھی!
如果它正确显示字形,但顺序错误(即,它们不是从右到左),那么这是您的操作问题 system/terminal/shell/program 您正在使用 运行 应用程序。
以上来自 gnome-terminal,它不正确支持阿拉伯语 RTL。
如果我 运行 在 mlterm 中使用相同的代码:
白框在那里是因为我使用的是阿拉伯语字体,它没有乌尔都语中的所有字符。
Burhan Khalid 的回答有效,但因为原始网页是用 utf-8 编码的:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
您应该更新请求的响应字段以匹配原始页面的编码:
from bs4 import BeautifulSoup
import urllib2
import requests
url="http://blog.jang.com.pk/blog_details.asp?id=11058"
r = requests.get(url)
# Update encoding to match source
r.encoding = "utf-8"
data = r.text
soup = BeautifulSoup(data,'lxml')
print str(soup.title)
现在您访问的任何字段都将具有正确的编码,而不必在每个字段的基础上设置为乌尔都语。