使用BeautifulSoup从HTML检索信息同一文本会多次出现吗?

2024-06-16 09:12:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下格式的HTML文档:

    <html><body><h2>Lorem ipsum <span name="datetime" class="0">dolor <strong>
sit</strong></span> amet, consectetur adipiscing elit.</h2>
    <p>Morbi sit amet malesuada nisl. <span name="address" class="1">Phasellus <strong>rhoncus diam</strong> sit amet augue dictum</span>, 
porta interdum odio tempus.</p></body></html>

我的输出应该是两个列表,一个包含文本中的所有单词,另一个包含跨度名称(如果适用),否则没有

    word list:
    Lorem
    ipsum
    dolor
    sit
    amet
    consectetur
    adipiscing
    elit
    Morbi
    sit
    amet
    malesuada
    nisl
    Phasellus
    rhoncus
    diam
    sit
    amet
    augue
    dictum
    porta
    interdum
    odio
    tempus
    name list:
    None
    None
    datetime
    datetime
    None
    None
    None
    None
    None
    None
    None
    None
    None
    address
    address
    address
    None
    None
    None
    None
    None
    None
    None
    None

我的代码:

from bs4 import BeautifulSoup

input_file = BeautifulSoup(open("ex2.html", 'r'), 'lxml')
tags = input_file.find_all()

word_list = []
name_list = []
translator = str.maketrans(":[];.,#&*\\/", "           ")

for tag in tags:
    try:
        name = tag.attrs['name']
    except:
        name = None
    words = tag.text.translate(translator)
    words = words.split(" ")
    for word in words:
        if words != '':
            word_list.append(word)
            name_list.append(name)

print(word_list)
print(name_list)

我的输出:

['Lorem', 'ipsum', 'dolor', 'sit', 'amet', '', 'consectetur', 'adipiscing', 'elit', 'Morbi', 'sit', 'amet', 'malesuada', 'nisl', '', 'Phasellus', 'rhoncus', 'diam', 'sit', 'amet', 'augue', 'dictum', '', 'porta', 'interdum', 'odio', 'tempus', '\n', 'Lorem', 'ipsum', 'dolor', 'sit', 'amet', '', 'consectetur', 'adipiscing', 'elit', 'Morbi', 'sit', 'amet', 'malesuada', 'nisl', '', 'Phasellus', 'rhoncus', 'diam', 'sit', 'amet', 'augue', 'dictum', '', 'porta', 'interdum', 'odio', 'tempus', '\n', 'Lorem', 'ipsum', '', 'dolor', 'sit', 'dolor', 'sit', 'sit', 'Morbi', 'sit', 'amet', 'malesuada', 'nisl', '', 'Phasellus', 'rhoncus', 'diam', 'sit', 'amet', 'augue', 'dictum', '', 'porta', 'interdum', 'odio', 'tempus', '', 'Phasellus', 'rhoncus', 'diam', 'sit', 'amet', 'augue', 'dictum', 'rhoncus', 'diam']
[None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'datetime', 'datetime', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, 'address', 'address', 'address', 'address', 'address', 'address', 'address', None, None]

问题是
A.有些文本在标记中出现多次,我不知道如何修复它
B有些单词是空的(“”),但即使我在if块中检查,它仍然会被添加到列表中

如果有人能给我一些建议,我会很有帮助:)


Tags: namenoneaddresslistwordipsumloremdolor
2条回答

啊,我找到了一个解决办法,很抱歉浪费了你的时间!我试了几个小时,没有找到解决办法,但现在我能找到了。 如果有人感兴趣:

from bs4 import BeautifulSoup

input_file = BeautifulSoup(open("ex2.html", 'r'), 'lxml')
tags = input_file.contents[0]

word_list = []
name_list = []
translator = str.maketrans(":[];.,#&*\\/", "           ")

def recurse(tags, name):
    for tag in tags:
        try:
            this_name = tag.attrs['name']
        except:
            this_name = name
        if tag.string == None:
            recurse(tag, this_name)
        else:
            words = tag.string.translate(translator)
            words = words.split(" ")
            for word in words:
                if word != '':
                    word_list.append(word)
                    name_list.append(this_name)
recurse(tags, None)

您可以通过以下方式提取文本:

text = input_file.text.replace("\n" , " ")
words = text.split()

这将产生:

'Lorem',
'ipsum',
 'dolor',
 'sit',
 'amet,',
 'consectetur',
 'adipiscing',
 'elit.',
 'Morbi',
 'sit',
 'amet',
 'malesuada',
 'nisl.',
 'Phasellus',
 'rhoncus',
 'diam',
 'sit',
 'amet',
 'augue',
 'dictum,',
 'porta',
 'interdum',
 'odio',
 'tempus.'

对于其他列表,您可以尝试:

tags = input_file.find_all("span")

for s in tags :
    if "name" in s.attrs:
        print(s["name"])

这将产生:

datetime
address

相关问题 更多 >