python - 从 HTML 中的脚本元素中提取对象键的值

标签 python beautifulsoup html-parsing lxml

<div class="heading-dom view">
    <script type="application/javascript">
        window.realty = {"user_id":4243456};
        <!--window.agency = < %- JSON.stringify(agency) % >;-->
        <!--window.agency = < %- JSON.stringify({}) % >-->
     </script>
</div>

我想要的输出是 4243456。我如何使用 beautifulsoup 的 lxml 提取它?

最佳答案

总的来说,这是一个有趣的问题——从 HTML 代码中的 JavaScript 代码中提取内容。

基本上,这意味着您首先需要进行 HTML 解析 - 找到所需的 script 元素并获取其文本。然后,第二步是从 realty 对象中提取所需的数字。

如果您采用正则表达式方法,您实际上可以重新使用正则表达式来定位所需的 script 元素并提取所需的变量 (BeautifulSoup allows to apply regular expression patterns 查找/过滤元素):

import re
from bs4 import BeautifulSoup


html = """
 <div class="heading-dom view">
     <script type="application/javascript">
        window.realty = {"user_id":4243456};
        <!--window.agency = < %- JSON.stringify(agency) % >;-->
        <!--window.agency = < %- JSON.stringify({}) % >-->
     </script>
</div>"""

pattern = re.compile(r'\{"user_id"\s*:\s*(\d+)\}')
soup = BeautifulSoup(html, "html.parser")
script = soup.find("script", text=pattern)

print(pattern.search(script.text).group(1))
# prints 4243456

让我们在这里分解\{"user_id"\s*:\s*(\d+)\}:

  • 反斜杠用于转义在正则表达式语法中具有特殊含义的字符
  • \s* 表示 - 零个或多个空格字符(把它放在那里以防万一你在对象定义中的 : 周围有额外的空格)<
  • \d+ 表示“一位或多位数字”
  • 括号定义一个 capturing group - 这是我们将字符串的特定部分提取到一个组中的方法,然后我们通过 .group(1)
  • 访问该组

请注意,@Evyatar 建议的简单 \d+ 表达式过于宽泛,您可能很容易得到误报。

以下是一些类似的主题,其中还包含一些其他选项:

关于python - 从 HTML 中的脚本元素中提取对象键的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831495/

相关文章:

python - 使用 Python 和 BeautifulSoup 获取字符串中 1-10 的正则表达式时出现问题

python - ValueError: 'conv2d_2/convolution'的负尺寸大小是由2减去3引起的

python - 如何覆盖 python 对象中的 __type__ 方法?

python - 图片下载 mime 类型验证 python 请求

python - 更改 keras 层的激活函数而不替换整个层

Python POST 请求失败,[Errno 10054] 现有连接被远程主机强制关闭

python - Beautiful Soup 无法识别按钮标签

javascript - 使用 cheerio 查找和替换某些属性

c++ - 索引html的文本内容

javascript - 异步 javascript 完成后加载网页并解析 html