Skip to main content
 首页 » 编程设计

python之从欧洲议会网站抓取数据时出现东欧字符问题

2025年05月04日18kuangbin

编辑:非常感谢您提出的所有答案。作为一个新手有点不知所措,但这是继续学习python的一个很大的动力!!

我正在尝试从欧洲议会网站上为一个研究项目抓取大量数据。第一步是创建一个所有议员的列表,但是由于许多东欧名字和他们使用的口音,我得到了很多缺失的条目。这是给我带来麻烦的一个例子(注意姓氏末尾的重音符号):

<td class="listcontentlight_left"> 
<a href="/members/expert/alphaOrder/view.do?language=EN&amp;id=28276" title="ANDRIKIENĖ, Laima Liucija">ANDRIKIENĖ, Laima Liucija</a> 
<br/> 
Group of the European People's Party (Christian Democrats) 
<br/> 
</td> 

到目前为止,我一直在使用 PyParser 和以下代码:

#parser_names 
name = Word(alphanums + alphas8bit) 
begin, end = map(Suppress, "><") 
names = begin + ZeroOrMore(name) + "," + ZeroOrMore(name) + end 
 
for name in names.searchString(page): 
    print(name) 

然而,这并没有捕捉到上面 html 中的名称。关于如何进行的任何建议?

最好的,托马斯

P.S:这是我目前所有的代码:

# -*- coding: utf-8 -*- 
 
import urllib.request 
from pyparsing_py3 import * 
 
page = urllib.request.urlopen("http://www.europarl.europa.eu/members/expert/alphaOrder.do?letter=B&language=EN") 
page = page.read().decode("utf8") 
 
 
#parser_names 
name = Word(alphanums + alphas8bit) 
begin, end = map(Suppress, "><") 
names = begin + ZeroOrMore(name) + "," + ZeroOrMore(name) + end 
 
for name in names.searchString(page): 
    print(name) 

请您参考如下方法:

我能够用代码显示 31 个以 A 开头的名字:

extended_chars = srange(r"[\0x80-\0x7FF]") 
special_chars = ' -''' 
name = Word(alphanums + alphas8bit + extended_chars + special_chars) 

正如 John 所注意到的,您需要更多的 unicode 字符 (extended_chars),并且一些名称带有连字符等(special chars)。计算您收到了多少个名字,并检查页面的计数是否与我为“A”所做的相同。

范围 0x80-0x87F 以可能所有欧洲语言的 utf8 编码 2 个字节序列。在 pyparsing 示例中,有用于希腊语的 greetingInGreek.py 和用于韩语文本解析的其他示例。

如果 2 个字节不够,请尝试:

extended_chars = u''.join(unichr(c) for c in xrange(127, 65536, 1))