如何使用BeautifulSoup获取HTML中的'datacell'文本

6 投票
3 回答
3342 浏览
提问于 2025-04-11 09:29

我一直在尝试从HTML文件中提取一些数据。我已经写好了逻辑来获取正确的单元格。现在我在获取“单元格”的实际内容时遇到了困难:

这是我的HTML片段:

headerRows[0][10].contents

  [<font size="+0"><font face="serif" size="1"><b>Apples Produced</b><font size="3">       
  </font></font></font>]

注意,这里是Python中的一个列表项 []。

我需要的值是“苹果产量”,但我就是无法获取到它。

任何建议都非常感谢

如果能推荐一本解释这个的好书,我会非常感激


谢谢你的回答。不过,难道没有更通用的答案吗?如果我的单元格没有加粗属性会发生什么呢?

比如它是:

 [<font size="+0"><font face="serif" size="1"><I>Apples Produced</I><font size="3">       
  </font></font></font>]

苹果产量

我正在努力学习如何阅读和理解文档,你的回答会对我有帮助

我非常感激这个帮助。这些回答的最好之处在于,从中总结出通用的知识要比我从BeautifulSoup文档中学到的容易多了。我是在Fortran时代学编程的,现在我在学习Python,真是惊叹于它的强大——BeautifulSoup就是一个例子。把文档整合成一个连贯的整体对我来说很困难。

谢谢

3 个回答

0

我有一个基础类,我在这个基础上扩展了所有的Beautiful Soup类,并添加了一些方法,这些方法可以帮助我获取一组元素中的文本,而不需要依赖它们的具体结构。其中一个方法如下:

  def clean(self, val):
    if type(val) is not StringType: val = str(val)
    val = re.sub(r'<.*?>', '', s) #remove tags
    val = re.sub("\s+" , " ", val) #collapse internal whitespace
    return val.strip() #remove leading & trailing whitespace
5

BeautifulSoup 的文档应该包含你需要的所有信息。在这个情况下,看起来你想使用 findNext 方法:

headerRows[0][10].findNext('b').string

还有一种更通用的解决方案,它不依赖于 <b> 标签。你可以使用 text 参数来调用 findAll 方法,这样你就可以只搜索 NavigableString 对象:

>>> s = BeautifulSoup(u'<p>Test 1 <span>More</span> Test 2</p>')
>>> u''.join([s.string for s in s.findAll(text=True)])
u'Test 1 More Test 2'
3

这段代码是一个示例,展示了如何在程序中使用某些功能。它可能涉及到一些基本的编程概念,比如变量、循环或者条件判断。

如果你是编程新手,理解这些代码的结构和逻辑是很重要的。通常,代码会按照一定的顺序执行,每一行都有它的作用。你可以把它想象成一个食谱,每一步都需要按照顺序来完成,才能做出美味的菜肴。

在学习编程时,遇到代码块是很常见的事情。你可以尝试逐行分析,看看每一部分是做什么的,这样会帮助你更好地理解整个程序的运行方式。

记住,编程就像学习一种新的语言,刚开始可能会觉得有点难,但只要多练习,就会慢慢变得熟悉。

headerRows[0][10].contents[0].find('b').string

撰写回答