Beautifulsoup代码不再在python脚本中工作

Beautifulsoup代码不再在python脚本中工作,python,beautifulsoup,Python,Beautifulsoup,我有一个python脚本,我遇到了麻烦,我想我已经把问题缩小到这一行: formkey = soup.find_all("script")[9].string[153:][:-141] 我相信这行应该返回这个页面上“form_key”的值 有什么我遗漏的吗?如果您想使用name=“form\u key” 做: 查看页面的源代码,这个值就是您想要的,如果您想要使用name=“form_key” 做: 查看页面的源代码,这个值就是您想要的,通过这种方式获得它更容易,而且比解析JavaScript更

我有一个python脚本,我遇到了麻烦,我想我已经把问题缩小到这一行:

formkey = soup.find_all("script")[9].string[153:][:-141]
我相信这行应该返回这个页面上“form_key”的值


有什么我遗漏的吗?如果您想使用
name=“form\u key”

做:


查看页面的源代码,这个值就是您想要的,如果您想要使用
name=“form_key”

做:


查看页面的源代码,这个值就是您想要的,通过这种方式获得它更容易,而且比解析JavaScript更具python风格。您应该使用beautifulsou查找元素,然后使用regex(
re
)解析目标元素内的文本。像这样:

import re, requests
from bs4 import BeautifulSoup

regex = re.compile(r'formKey:\s*"(.*)"')

r = requests.get('https://shop.adidas.ae/en/forum-mis-wrap-shoes/BY4412.html')
soup = BeautifulSoup(r.text, "html5lib")
scripts = soup.find_all("script")

all_of_them = [None if match is None else match.groups() for match in [regex.search(script.text) for script in scripts]]
just_the_matches = [match.groups() for match in [regex.search(script.text) for script in scripts] if script is not None]
结果是:

>>> all_of_them
[None, None, None, None, None, None, None, None, None, (u'U53YNK8paAE4Cdij',), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> just_the_matches
[(u'U53YNK8paAE4Cdij',)]
重要提示:

  • 不要做出假设,例如“这是第10个脚本”或“我想要的数据正好在XXX和YYY字符之间”
  • 如果他们添加了一个脚本,你的程序就坏了。你不会想要的
  • 如果他们改变了第十个脚本的一点,你的程序就坏了。你不会想要的
  • 试着一直思考如何使您的程序对外部干扰更加健壮
另外:

  • 正如@alexisdevarenes所说,如果您可以在多个位置获取数据,请尝试从最容易的位置(或最可靠的位置)检索数据

您应该使用beautifulsou查找元素,然后使用regex(
re
)解析目标元素中的文本。像这样:

import re, requests
from bs4 import BeautifulSoup

regex = re.compile(r'formKey:\s*"(.*)"')

r = requests.get('https://shop.adidas.ae/en/forum-mis-wrap-shoes/BY4412.html')
soup = BeautifulSoup(r.text, "html5lib")
scripts = soup.find_all("script")

all_of_them = [None if match is None else match.groups() for match in [regex.search(script.text) for script in scripts]]
just_the_matches = [match.groups() for match in [regex.search(script.text) for script in scripts] if script is not None]
结果是:

>>> all_of_them
[None, None, None, None, None, None, None, None, None, (u'U53YNK8paAE4Cdij',), None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]
>>> just_the_matches
[(u'U53YNK8paAE4Cdij',)]
重要提示:

  • 不要做出假设,例如“这是第10个脚本”或“我想要的数据正好在XXX和YYY字符之间”
  • 如果他们添加了一个脚本,你的程序就坏了。你不会想要的
  • 如果他们改变了第十个脚本的一点,你的程序就坏了。你不会想要的
  • 试着一直思考如何使您的程序对外部干扰更加健壮
另外:

  • 正如@alexisdevarenes所说,如果您可以在多个位置获取数据,请尝试从最容易的位置(或最可靠的位置)检索数据

应该是
[153:-141]
?为什么是两个不同的部分?
script[9]
里面没有
form\u key
。我看到的
form\u key
唯一的地方是在两个URL中,
谢谢Barmar,我想它指的是
truncateOptions();装饰列表('cart-sidebar','none recursive')$j('document').ready(函数(){var minicartOptions={formKey:“oDPKFYizNvqu71p9”,签出数据层:{“actionField”:{“步骤”:1},“产品”:[]};Mini=新的迷你车(minicartOptions);Mini.init();})这是
脚本[14]
,而不是
脚本[9]
。但是它没有
form\u key
。啊,它有
formKey
。它不应该是
[153:-141]
?为什么是两个不同的部分?
script[9]
里面没有
form\u key
。我看到的
form\u key
唯一的地方是在两个URL中,
谢谢Barmar,我想它指的是
truncateOptions();装饰列表('cart-sidebar','none recursive')$j('document').ready(函数(){var minicartOptions={formKey:“oDPKFYizNvqu71p9”,签出数据层:{“actionField”:{“步骤”:1},“产品”:[]};Mini=新的迷你车(minicartOptions);Mini.init();})这是
脚本[14]
,而不是
脚本[9]
。但是它没有
form\u key
。啊,它有
formKey
。欢迎来到SO欢迎光临不客气