首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python列表中对bs4可导航字符串进行编码?

如何在python列表中对bs4可导航字符串进行编码?
EN

Stack Overflow用户
提问于 2017-07-17 08:37:10
回答 1查看 1.9K关注 0票数 1

我进行了广泛的搜索,虽然有大量的资源可以回答这个问题,但我似乎就是找不到任何可行的答案。我看了内德·巴切尔德关于统一码(https://nedbatchelder.com/text/unipain.html)的演讲,并通读了很多关于S.O.的答案,但我仍然不知所措。

我正在使用Python3和BeautifulSoup 4从维基百科中抓取和解析一个表。我有一个名为fighter_B的列表

代码语言:javascript
复制
    print(type(fighter_B))
    <class 'list'>

    print(type(fighter_B[0])
    <class 'bs4.element.NavigableString'>

列表中的第二个和第三个观察值包含非英语字母的名称,这些名称会抛出错误,例如Fabrício Werdum。当我尝试打印fighter的名字时,我得到了这个错误,

代码语言:javascript
复制
print(fighter_B[1])
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128)

我尝试过各种编码函数,但总是抛出相同的错误。

代码语言:javascript
复制
[fighter.encode('utf-8') for fighter in fighter_B]
print(fighter_B[1])
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128)

for i in fighter_B:
    i.encode('utf-8')
print(fighter_B[1])
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128)

[fighter.decode('utf-8') for fighter in fighter_B]
AttributeError: 'NavigableString' object has no attribute 'decode'

[str(fighter).decode('utf-8) for fighter in fighter_B]
AttributeError: 'str' object has no attribute 'decode'

[fighter.encode('ascii') for fighter in fighter_B]
UnicodeEncodeError: 'ascii' codec can't encode character '\xed' in position 4: ordinal not in range(128)

我看到的各种答案都简单地建议将变量编码为'utf-8‘。我不确定为什么这里的编码不起作用,我想知道这是不是因为列表中的每个项目都是'bs4.element.NavigableString‘类型。任何技巧都将非常感谢,因为我在这一点上感到完全困惑。

EN

回答 1

Stack Overflow用户

发布于 2017-07-18 03:56:43

初步答案:

我遇到过这样的问题,您试图迭代一些HTML块以提取一些值,但它看起来如下所示:

代码语言:javascript
复制
>>> for elem in li:
    type(elem)

<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>
<class 'bs4.element.Tag'>
<class 'bs4.element.NavigableString'>

在这些情况下,您不能轻松地遍历对象,因为对象具有不同的方法。因此,添加另一个包含元素的进一步特异性的findAll可能是有意义的。

下面的代码会为你执行吗?

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

url = r'https://en.wikipedia.org/wiki/List_of_male_mixed_martial_artists'

html = requests.get(url)
soup = BeautifulSoup(html.text, 'html.parser')

names = []

for li in soup.findAll('li'):
    for i,link in enumerate(li.findAll('a')):
        if i == 1:
            names.append(link.getText())

'Fabrício Werdum' in names是否返回True

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45134560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档