【问题标题】:Retrieving information from HTML using BeautifulSoup - same text appears multiple times?使用 BeautifulSoup 从 HTML 中检索信息 - 相同的文本出现多次?
【发布时间】:2019-11-13 00:44:23
【问题描述】:

我有这种格式的 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]

问题是
一个。一些文本在标签中出现多次,我不知道如何修复它
湾。有些单词是空的(''),但即使我在 if 块中检查它仍然会被添加到列表中

如果有人能给我一些指点,那将非常有帮助:)

【问题讨论】:

    标签: python html python-3.x beautifulsoup


    【解决方案1】:

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

    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
    

    【讨论】:

    • 感谢您的回复!问题是,我需要访问每个单词的名称,其中有些单词没有跨度,因此没有,有些单词有跨度名称,所以第二个列表必须与第一个列表具有相同的长度。
    【解决方案2】:

    啊,我找到了解决方案,抱歉浪费您的时间 LukasP!尝试了几个小时并没有找到解决方案,但现在我可以弄清楚了。 如果有人有兴趣:

    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)
    

    【讨论】:

      猜你喜欢
      • 2021-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2017-04-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多