已解决:BeautifulSoup4 get_text() 在 mac 上抓取时有效,但在 raspbian 上返回空字



我正在编写一个简单的网络爬虫,到目前为止,它运行得非常好 - 无论如何在我的Macbook上。我的目的是将脚本移动到我的 Raspberry Pi 并每天自动运行它 - 但一行代码无法正常工作。通常,我可以通过在Stack Overflow上谷歌搜索和阅读来解决我的大部分问题,但现在我被难住了。

所以我正在解析网页上的几个 type='application/ld+json' 部分,然后将每个部分作为 json 加载以供进一步处理。我跳过了第一个元素,因为我知道这对我的目的并不重要。

data = soup.select("[type='application/ld+json']")
for j in data[1:]:
temp = j.get_text()
try:
temp = json.loads(temp)
<do stuff> 
except Exception as err:
print(err)

当我在Mac上运行代码时,一切正常。但是,当我在我的树莓运行脚本时,get_text(( 返回 en 空字符串,这给出了错误

"Expecting value: line 1 column 1 (char 0)"

j的示例内容,在.get_text((之前:

<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "City",
"address" : {
"@type": "PostalAddress",
"City" : "Oslo"
}
}
</script>

我尝试添加一些用于调试的打印函数,包括检查变量 j 是否确实包含某些内容并且确实包含 - 一切看起来都正确,就像在我的 Mac 上一样。我已经检查了对象类型,j是一个美丽的汤标签,而temp是一个字符串efter .get_text((。唯一的区别是 get_text(( 在我的 Raspberry 上返回一个空字符串,而当我的 Mac 上运行时,它会返回"脚本"的内容。

我错过了什么或做错了什么?(除了命名我的变量"temp"(

编辑:好的,问题解决了。显然,我在Mac上使用BS 4.8.2,在覆盆子上使用4.9.0。我在文档中找到了这个:

从 Beautiful Soup 版本 4.9.0 开始,当使用 lxml 或 html.parser 时,"脚本"、"样式"和"模板"标签的内容不被视为"文本",因为这些标签不是页面中人类可见内容的一部分。

我不知道这是否是正确的方法,但是一旦我改变了这个

temp = j.get_text()

对此

temp = j.string

一切都按预期工作。

试试这个,

import json
from bs4 import BeautifulSoup
soup = BeautifulSoup("""<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "City",
"address" : {
"@type": "PostalAddress",
"City" : "Oslo"
}
}
</script>""", "html.parser")
json.loads(soup.find("script", attrs={"type": "application/ld+json"}).text)

如何查找仅具有某些属性的标签 - 美丽汤

最新更新