Python 2.7 使用<;脚本>;和var

Python 2.7 使用<;脚本>;和var,python-2.7,web-scraping,beautifulsoup,Python 2.7,Web Scraping,Beautifulsoup,下面是我想从中提取“name”和“event_place”的页面的html代码的一部分。然而,我以前从未见过数据以这种复杂的方式隐藏起来。在标签中有“var person”,在标签中,名称出现在“personBestName”下,即“John Stuart” 类似地,对于'var person'下的'event_place'。。。等。活动地点实体应为“加拿大安大略省汉密尔顿(城市/城市)B” 编辑: # Get other fields rawJ = Soup.find_all('script'

下面是我想从中提取“name”和“event_place”的页面的html代码的一部分。然而,我以前从未见过数据以这种复杂的方式隐藏起来。在标签中有“var person”,在标签中,名称出现在“personBestName”下,即“John Stuart”

类似地,对于'var person'下的'event_place'。。。等。活动地点实体应为“加拿大安大略省汉密尔顿(城市/城市)B”

编辑:

# Get other fields
rawJ = Soup.find_all('script')
J = str(rawJ[10])
J1 = J.split('var person = ')
J2 = J1[1].rsplit('var record =')
J3 = J2[0].rsplit(';', 1)

JsonText = J3[0]
#print JsonText

s = json.loads(JsonText)
print s["personBestName"]

# UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)
这个长字符串是,它大致映射到python字典。您有键值对,例如
“id”
“p_14062397399”

所以我美化了JSON,您可以很容易地看到键值对和嵌套结构。要提取姓名和地址,请执行以下操作:

from bs4 import BeautifulSoup as bs
from urllib import urlopen
import json

Soup = bs(urlopen('https://familysearch.org/pal:/MM9.1.1/KHR6-D6D').read())

rawJ = Soup.find_all('script')
J = str(rawJ[10])
J1 = J.split('var person = ')
J2 = J1[1].rsplit('var record =')
J3 = J2[0].rsplit(';', 1)

JsonText = J3[0].decode('utf-8')


s = json.loads(JsonText)
print s["personBestName"]
for i in s["facts"]:
    if i["type"] == "http://gedcomx.org/Census":
        print i["place"]["fields"][0]["values"][0]["text"]

这就是JSON。您可以使用python中的
json
模块轻松地读入。谢谢,但是我应该把什么作为“s”呢?我尝试了s=Soup。find_all('script')和s=Soup都给了我错误。谢谢,但是我如何从整个脚本中自动提取Json部分呢?也就是从开头删除“var person=”部分,在结尾删除相同的部分。我可以拆分开头,但结尾相当棘手。我想我已经找到了如何拼接和提取json文本的方法,但是我在运行上面的编辑代码时遇到了这个错误:UnicodeEncodeError:“ascii”编解码器无法对位置5中的字符u'\xe9'进行编码:序号不在范围内(128)我尝试过,但该行出现了类似的错误:UnicodeDecodeError:“ascii”编解码器无法解码第699位的字节0xc3:ordinal不在范围(128)Hi Rishav,我想知道我的python或bs设置是否有问题,我复制、粘贴,然后运行代码,仍然出现以下错误:UnicodeEncodeError:“ascii”编解码器无法对位置5中的字符u'\xe9'进行编码:序号不在范围内(128)
# Get other fields
rawJ = Soup.find_all('script')
J = str(rawJ[10])
J1 = J.split('var person = ')
J2 = J1[1].rsplit('var record =')
J3 = J2[0].rsplit(';', 1)

JsonText = J3[0]
#print JsonText

s = json.loads(JsonText)
print s["personBestName"]

# UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 5: ordinal not in range(128)
from bs4 import BeautifulSoup as bs
from urllib import urlopen
import json

Soup = bs(urlopen('https://familysearch.org/pal:/MM9.1.1/KHR6-D6D').read())

rawJ = Soup.find_all('script')
J = str(rawJ[10])
J1 = J.split('var person = ')
J2 = J1[1].rsplit('var record =')
J3 = J2[0].rsplit(';', 1)

JsonText = J3[0].decode('utf-8')


s = json.loads(JsonText)
print s["personBestName"]
for i in s["facts"]:
    if i["type"] == "http://gedcomx.org/Census":
        print i["place"]["fields"][0]["values"][0]["text"]