从find_next_sibling(),BeautifulSoup中提取文本

时间:2016-09-10 23:31:20

标签: python python-2.7 beautifulsoup

我试图从这个网站上提取中文字符的描述:http://www.hsk.academy/en/hsk_1

示例html:

        <tr>
            <td>
                <span class="hanzi"><a href="/en/characters/%E7%88%B1">爱</a></span>
                <br/>ài</td>
            <td>to love; affection; to be fond of; to like</td>
        </tr>

我希望将最后一个td标记的文本放入每个字符描述的列表中。但是,目前我给了整个标签,包括标签本身。我不能.text的find_next_sibling():AttributeError:&#39; NoneType&#39;对象没有属性&#39; text&#39;。

这是我的代码:

for item in soup.find_all("td"):   
        EnglishItem = item.find_next_sibling()
        if EnglishItem:           
            if not any(EnglishItem in s for s in EnglishDescriptionList):
                EnglishDescriptionList.insert(count, EnglishItem)
                count += 1
            print EnglishDescriptionList

1 个答案:

答案 0 :(得分:1)

试试这个:

english_descriptions = []
table = soup.find('table', id='flat_list')
for e in table.select('.hanzi'):
    english_desc = e.parent.find_next_sibling().text
    if not any(english_desc in s for s in english_descriptions):
        english_descriptions.append(english_desc)

这将选择(查找)类hanzi的所有标记(在id="flat_list"表中),这将是<span>标记。然后访问每个<span>的父级 - 这是每行中的第一个<td>。最后访问下一个兄弟,这是包含英文描述的目标标记。

您可以取消count,只需使用

将项目附加到列表中即可
english_descriptions.append()

另外,我不认为您需要检查当前的英语描述是否是现有英语描述的子字符串(这是您尝试做的事情吗?)。如果没有,你可以简化这个列表理解:

table = soup.find('table', id='flat_list')
english_descriptions = [e.parent.find_next_sibling().text for e in table.select('.hanzi')]