如何使用 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)

现在您访问的任何字段都将具有正确的编码,而不必在每个字段的基础上设置为乌尔都语。