【问题标题】:Parsing w/ case-sensitive text/tags使用区分大小写的文本/标签进行解析
【发布时间】:2019-06-15 21:14:00
【问题描述】:

我正在使用 beautifulsoup 解析文本,并希望返回父标签下方/下方的标签。但是,在三个不同的文档之间,“所需数据集”的大小写方式之间存在不一致。见下文:

<td class="pl "...-unimportant bits of script here-...;>Desired Data Set...</td>

<td class="pl "...-unimportant bits of script here-...;>Desired data set...</td>

<td class="pl "...-unimportant bits of script here-...;>desired data set...</td>

到目前为止,这是我的代码:

import requests
from bs4 import BeautifulSoup

soup = BeautifulSoup(data.text, 'lxml')

filenames = ['Desired Data Set','desired data set','Desired data set']

for filename in filenames:
    for item in soup.select('filename:contains("' + filename + '")'):
                    for td in item.find('td', text=filename).parent.find_all('td'):
                        data = [td.text.strip()]
                        print(data) 

...它的工作原理。

但是,当我开始使用更大的数据集时,我确信会出现更多的不一致,即使上述方法有效,它也很“hacky”,既不高效也不谨慎。我只想为所有需要的数据集使用一个文件名。

我尝试使用 lower() 降低整个汤,但它会引发 NoneType 错误。

【问题讨论】:

    标签: python text beautifulsoup tags


    【解决方案1】:

    您可以使用find_all() 方法的string 参数:

    from bs4 import BeautifulSoup
    
    data = '''<table><tr><td class="pl ">Desired Data Set...</td>
    <td class="pl ">Desired data set...</td>
    <td class="pl ">desired data set...</td>
    <td class="pl ">Something else</td>
    </tr></table>
    '''
    
    soup = BeautifulSoup(data, 'lxml')
    
    for td in soup.find_all('td', string=lambda t: 'desired data set' in t.lower()):
        print(td)
    

    打印:

    <td class="pl">Desired Data Set...</td>
    <td class="pl">Desired data set...</td>
    <td class="pl">desired data set...</td>
    

    【讨论】:

    • 我需要在 OP 中保留一般形式的代码,以便解析许多不同的汤。 for td in item.find('td', text=filename).parent.find_all('td') 位需要以某种方式或形式。也就是说,我如何使用以下代码的结构并实施您的建议?在我尝试实现您的代码的任何地方,我都会不断抛出 NoneType 错误。
    【解决方案2】:

    soup = BeautifulSoup(data.text.lower(), 'lxml') 可能是解决问题的一种“hacky”方式,但对于我的具体示例,它确实有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-24
      相关资源
      最近更新 更多