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éjà vu</p>
<p>c'est la vie !</p>
<script type="text/javascript">
...
varHTML = '<p>voilà</p>
<p>déjà 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éjà vu</p>
<p>c'est la vie !</p>';
...
</script>
</body>
</html>
如您所见,在第一部分中,javascript 之外的所有重音都可以。但是对于javascript里面的html,BeautifulSoup并不是把é
和à
转换成“é”和“à”。
我该如何解决?
奖金问题:
在这个例子中,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éjà 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("\","")
希望有一天有人能做到,并且它不是重复的!
格雷戈里
在 iPython 上使用 BeautifulSoup,我试图抓取网页并在 javascript 脚本中获取一些 html 元素,但我遇到了一些问题编码。
页面是法语的,所以有很多重音,有的是直接写在源代码里的,有的是用他们的html代码写的。
示例:
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éjà 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éjà vu</p>
<p>c'est la vie !</p>';
...
</script>
</body>
</html>
如您所见,在第一部分中,javascript 之外的所有重音都可以。但是对于javascript里面的html,BeautifulSoup并不是把é
和à
转换成“é”和“à”。
我该如何解决?
奖金问题:
在这个例子中,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éjà 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("\","")
希望有一天有人能做到,并且它不是重复的!
格雷戈里