【问题标题】:HTML text extractionHTML文本提取
【发布时间】:2018-10-23 13:40:18
【问题描述】:

我有一份来自 Beautiful Soup 的清单,如下所示。

soup = BeautifulSoup(page.content, 'html.parser')
area = soup.select("td strong")

例如

area=[
<strong><span style="font-size:1.4em;">120 Beats Per Minute (15)</span><br/><br/>Cinema</strong>, 
<strong><span style="font-size:1.4em;">A Little Night Music</span><br/><br/>Theatre</strong>, 
<strong><span style="font-size:1.4em;">A Wrinkle in Time (PG)</span><br/><br/>Cinema</strong>
]

我需要删除除 Cinema、Theatre 之外的文本。

我想出了下面的表达式,但我不能将它应用到列表中

x[x.find('<br/><br/>')+10:].replace('</strong>','')

任何想法如何应用此表达式从列表中提取数据以创建新列表?我试过这个:

clean_area=[]
for x in area:
   clean_area.append(x[x.find('<br/><br/>')+10:].replace('</strong>',''))

但我收到此错误: TypeError:+ 的不支持的操作数类型:“NoneType”和“int”

【问题讨论】:

  • 嗯,那个错误是说x.find('&lt;br/&gt;&lt;br/&gt;')没找到任何东西
  • 如果我手动将列表元素之一复制/粘贴到字符串 x 我的表达式有效。
  • 也许其他区域字符串之一没有两个中断?
  • 我建议实际解析文本而不是寻找子标签。 stackoverflow.com/q/23380171/2308683
  • 我不能因为文本被合并 - 我需要将标签和文本转储到一个普通列表中,以便我可以操作数据。有什么想法吗?

标签: python html beautifulsoup


【解决方案1】:

你要使用的是decompose,这会去掉你不想要的任何标签。

在这种情况下,它是span

所以

for x in soup.findAll("span"):
    x.decompose()

print(soup.text)

返回

Cinema, Theatre

【讨论】:

    【解决方案2】:

    大约一个小时前我正在回复你的第一篇帖子,但你删除了它。

    我不确定这是否是最好的方法,但这是我想出的:

    text = [
    """<strong><span style="font-size:1.4em;">120 Beats Per Minute (15)</span><br/><br/>Cinema</strong>""", 
    """<strong><span style="font-size:1.4em;">A Little Night Music</span><br/><br/>Theatre</strong>""", 
    """<strong><span style="font-size:1.4em;">A Wrinkle in Time (PG)</span><br/><br/>Cinema</strong>"""
    ]
    
    text = ''.join(text) #Converting list of strings to one string
    
    start = "<br/><br/>" #Start indication
    end = "</" #End indication
    
    clean_area = []
    
    index = 0
    while index < len(text):
        index = text.find(start, index)
        if index == -1:
            break
        clean_area.append(text[index+len(start):text.find(end, index)])
        index += len(start)
    
    print(clean_area)
    

    【讨论】:

    • 我拥有的文本位于一维列表中,每个元素对应于您答案中的文本字符串。如何使用您的代码遍历列表?
    • 你可以通过 area = ''.join(area) 将列表变成一个字符串。我将编辑我的答案以用你的例子展示它
    【解决方案3】:

    我只能通过 2 次通行证来完成这项工作。我敢肯定这不是最好的方法,但至少有效。

    soup = BeautifulSoup(result.content, "html.parser")
    
    for x in soup.findAll("span"):
        x.decompose()
    
    area = soup.select("td strong")
    
    a = str(area)
    soup2 = BeautifulSoup(a)
    
    
    
    tr = []
    for tag in soup2.find_all(True):
        tr.append(tag.text)
    
    
    clean_area = [] 
    for i in tr[::3]:
        clean_area.append(i)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-26
      • 2012-04-20
      • 1970-01-01
      • 2023-03-04
      相关资源
      最近更新 更多