【问题标题】:Does BeautifulSoup still work on two concatenated HTML files?BeautifulSoup 是否仍然适用于两个连接的 HTML 文件?
【发布时间】:2015-06-26 17:57:58
【问题描述】:

我有一个将两个 HTML 文件合并为一个的脚本。它实际上只是在第一个 HTML 代码之后插入第二个 HTML 代码。

htmlfile1 = urllib.urlopen(url1)
htmlfile2 = urllib.urlopen(url2)

htmltext1 = htmlfile1.read()
htmltext2 = htmlfile2.read()

name=symbolslist[i]+'.html'    

o=open(name, "w")  
o.write(htmltext1)
o.write(htmltext2)
o.close()    

在我的另一个线程中,当解决方案正确时,我似乎无法使用 bs4 解析第二个 HTML 部分的信息。

我在解析第一个 HTML 上的信息时没有问题。

线程: beautifulsoup parsing - dealing with superscript?

因此我想知道 Beautiful Soup 是否适用于串联的 HTML。

【问题讨论】:

  • 是什么阻止您尝试并回发结果?我会先尝试一些测试 HTML 文件。
  • BS 不做自己的解析,所以我想这取决于你使用的解析器。您想要这样做有什么特别的原因吗?
  • 这可能还取决于 HTML 的类型。例如,我只是尝试连接不同文件的两个副本;至少在我拥有的 bs4、lxml 和 libxml2 版本中,一个有效的 HTML5 文件加倍使其变得糟糕,一个有效的 HTML 4.01 过渡文件默默地吃掉了第二个 HEAD 但似乎可以工作,一个有效的 pre-HTML 3 文件就可以了很好。
  • “这是两个 Yahoo Finance 页面连接在一起” - 为什么?!
  • “我认为通过连接版本解析会更容易” - 这似乎是一个奇怪的假设,为什么不只是 for 在相关页面上循环呢? “我正在使用 beautifulsoup4” - 同样,它不进行自己的解析。你用的是哪个解析器?

标签: python html beautifulsoup concatenation


【解决方案1】:

您不应该期望这会起作用。解析器希望使用 一个 HTML 文档。

HTML 解析器做 尝试修复损坏的 HTML,因此您可能会得到 一些 的结果。但是,由于id 属性值在 HTML 中必须是唯一的,因此可能不会像您预期的那样工作。

只需将您的 HTML 存储在单独的文件中,然后为它们创建单独的 BeautifulSoup() 对象。您可以在内存中拥有多个 soup 对象而不会出现问题。

【讨论】:

  • 在使用 lxml 解析器并将连接的文件包装在虚拟标签中时,它似乎不起作用。我本来希望 BeautifulSoup 在这种情况下加载整个文件,即使它不再是 HTML 而只是 XML。
  • 实际上它通过将连接的文件包装到一个虚拟标签中而不指定任何解析器来工作。这个问题在所提供的示例中并不重要,但有时使用连接的 HTML 文件更容易(例如,当您在 find 之后的循环中使用 cat 命令构建它们时)
  • @EricBurel:不指定解析器仍然选择 HTML 解析器。
  • 嗯,很奇怪我没有相同的行为,但 html 不起作用(并且不应该因为文档包含连接在一起的多个页面)。它没有某种自动选择功能吗?
  • @EricBurel:Beautifulsoup 支持三种不同的 HTML 解析器;这些中的每一个都以不同的方式处理损坏的 HTML。连接 HTML 文档,即使使用新的父容器,也总是会产生损坏的 HTML。接下来,BeautifulSoup 将默认使用 lxml(如果已安装),然后使用 html5lib(如果已安装),然后使用标准库 html.parser。如果您指定不同的解析器作为第二个参数,您可能会看到不同的结果。见crummy.com/software/BeautifulSoup/bs4/doc/…
猜你喜欢
  • 1970-01-01
  • 2014-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-30
  • 2019-03-19
  • 1970-01-01
  • 2016-05-21
相关资源
最近更新 更多