【问题标题】:BeautifulSoup doesn't read html within javascript with the right encodingBeautifulSoup 不使用正确编码读取 javascript 中的 html
【发布时间】:2015-08-28 11:47:11
【问题描述】:

在 iPython 上使用 BeautifulSoup,我正在尝试抓取网页并在 javascript 脚本中获取一些 html 元素,但我遇到了一些编码问题。

页面是法语的,所以口音很重,有的直接写在源代码里,有的用自己的html代码写的。

示例:

html_doc = """<html>
<body>
<p>voilà</p>
<p>d&eacute;j&agrave; vu</p>
<p>c'est la vie !</p>

<script type="text/javascript">
...
varHTML = '<p>voilà</p>
<p>d&eacute;j&agrave; vu</p>
<p>c\'est la vie !</p>';
...
</script>
</body>
</html>"""

from bs4 import BeautifulSoup
BeautifulSoup(html_doc)

我得到这个结果:

<html>
<body>
<p>voilà</p>
<p>déjà vu</p>
<p>c'est la vie !</p>
<script type="text/javascript">
...
varHTML = '<p>voilà</p>
<p>d&eacute;j&agrave; vu</p>
<p>c'est la vie !</p>';
...
</script>
</body>
</html>

如您所见,在第一部分中,在 javascript 之外,所有的重音都可以。但是对于 javascript 中的 html,BeautifulSoup 不会将 &amp;eacute;&amp;agrave; 转换为 "é" 和 "à"。

我该如何解决?

奖励问题:

在此示例中,BeautifulSoup 正确地将 C\'est 转换为 C'est,但使用与我在线阅读的 html 页面相同的撇号,当撇号在javascript部分,所以我得到:

<html>
<body>
<p>voilà</p>
<p>déjà vu</p>
<p>c'est la vie !</p>
<script type="text/javascript">
...
varHTML = '<p>voilà</p>
<p>d&eacute;j&agrave; vu</p>
<p>c\'est la vie !</p>';
...
</script>
</body>
</html>

你能理解为什么吗?

最后,我希望将 javascript 中的所有 html 部分作为 javascript 之外的部分。

非常感谢您的帮助! 格雷戈里

【问题讨论】:

  • 嗨@jumojer 感谢您的回复。我不认为这是同一个问题。我尝试使用 BeautifulSoup 忽略 utf-8 但我仍然遇到同样的问题。在 javascript 部分之外,BeautifulSoup 正在以正确的编码读取所有文本。问题在于在 javascript 代码中读取包含 html 元素的变量。

标签: python python-2.7 unicode beautifulsoup


【解决方案1】:

我终于解决了。

使用正则表达式,我将 html 部分作为文本提取到 javascript 中,然后在其上重新应用 BeautifulSoup 以获得可读的 html 代码:

from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(html_doc)
html_from_javascript = re.findall("varHTML = '(.*)';",soup.text)
print str(BeautifulSoup(html_from_javascript[0]))

给:&lt;p&gt;voilà&lt;/p&gt;&lt;p&gt;déjà vu&lt;/p&gt;&lt;p&gt;c'est la vie !&lt;/p&gt;

关于奖励问题

问题是网页上的初始代码被双重转义。 所以代码不是C\'est,而是C\\\'est

我用这个函数解决了它:

lambda x: x.replace("\\","")

希望有一天它可以有人并且它不是重复的!

格雷戈里

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 2014-09-30
    • 1970-01-01
    • 2013-08-20
    相关资源
    最近更新 更多