【问题标题】:How do I filter HTML elements in Python如何在 Python 中过滤 HTML 元素
【发布时间】:2022-01-18 15:34:45
【问题描述】:

我通过抓取网站获得了字符串列表。我希望代码打印该列表中的 HTML 元素,如果它们包含“L”。 我设法编写了一个在“普通列表”上运行良好的代码,我手动将其写入代码(下面的示例 1),但是一旦我尝试使用该代码过滤 HTML 元素列表,它只会打印空“[ ]" 即使我知道应该有多个值。

这是有效的代码:

import urllib.request
from bs4 import BeautifulSoup

url = 'https://kouluruoka.fi/menu/kouvola_koulujenruokalista'
request = urllib.request.Request(url)
content = urllib.request.urlopen(request)
parse = BeautifulSoup(content, 'html.parser')

span_elements = parse.find_all('span')

#a list like this works just fine
lst = ['HOLA','BONJOUR','HELLO','KONNICHIWA','SALVE','GUTEN DAG']

filtered_list = list(filter(lambda k: 'L' in k, lst))

print(filtered_list)

>>>['HOLA','HELLO','SALVE']

但是一旦我使用我的网络抓取列表 (span_elements) 代替 hellos 列表,它就会打印空白:

import urllib.request
from bs4 import BeautifulSoup

url = 'https://kouluruoka.fi/menu/kouvola_koulujenruokalista'
request = urllib.request.Request(url)
content = urllib.request.urlopen(request)
parse = BeautifulSoup(content, 'html.parser')

span_elements = parse.find_all('span')

#a list of HTML elements doesnt work
lst = span_elements

filtered_list = list(filter(lambda k: 'L' in k, lst))

print(filtered_list)

>>>[]

我已经尝试了几个小时,但无济于事,不胜感激! 谢谢!

【问题讨论】:

  • 举个例子,你希望网站的输出是什么?

标签: python html web-scraping filter beautifulsoup


【解决方案1】:

filtered_list 中的元素不是字符串,而是 bs4 元素对象。如果您在使用in 之前更改过滤器以将它们转换为str,则代码有效:

filtered_list = list(filter(lambda k: 'L' in str(k), lst))

如果您只想要<span> 的内部,请使用.text

lst = [ x.text for x in span_elements ]
filtered_list = list(filter(lambda k: 'L' in k, lst))

我从未使用过 bs4,但线索在于打印原始列表:

print(lst)

输出:

[<span>KOULURUOKA.FI</span>, <span></span>, <span>Tämä<!-- --> viikko</span>, ...

这不是字符串列表,看不到'

【讨论】:

    【解决方案2】:

    您需要一个对每个 span 元素的 text 属性的引用列表:

    import requests
    from bs4 import BeautifulSoup as BS
    
    (r := requests.get('https://kouluruoka.fi/menu/kouvola_koulujenruokalista')).raise_for_status()
    
    soup = BS(r.text, 'lxml')
    
    span = soup.find_all('span')
    
    print(list(filter(lambda k: 'L' in k, [s.text for s in span])))
    

    【讨论】:

      猜你喜欢
      • 2021-11-12
      • 1970-01-01
      • 2018-07-20
      • 1970-01-01
      • 2020-06-27
      • 2011-02-09
      • 1970-01-01
      • 2017-10-26
      • 2020-12-20
      相关资源
      最近更新 更多