BeautifulSoup 未使用正确的编码在 javascript 中读取 html

BeautifulSoup doesn't read html within javascript with the right encoding

在 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并不是把&eacute;&agrave;转换成“é”和“à”。

我该如何解决?

奖金问题:

在这个例子中,BeautifulSoup 正确地转换了 C'est 中的 C\'est,但是使用了我正在在线阅读的 html 页面中的相同撇号,BeautifulSoup 在结果中保留“\”,当 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 外的部分。

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

终于解决了

使用正则表达式,我将 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]))

给出:<p>voilà</p><p>déjà vu</p><p>c'est la vie !</p>

关于奖金问题

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

我用这个函数解决了它:

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

希望有一天有人能做到,并且它不是重复的!

格雷戈里