我正在编写一个简单的网络爬虫,到目前为止,它运行得非常好 - 无论如何在我的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)
如何查找仅具有某些属性的标签 - 美丽汤