如何使用 Beautiful Soup 提取 <script> 标签中的字符串?

新手上路,请多包涵

在给定的 .html 页面中,我有一个脚本标签,如下所示:

      <script>jQuery(window).load(function () {
  setTimeout(function(){
    jQuery("input[name=Email]").val("name@email.com");
  }, 1000);
});</script>

如何使用 Beautiful Soup 提取电子邮件地址?

原文由 dundonian 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

要向@Bob 的答案 添加更多内容,并假设您还需要在 HTML 中找到 script 标签,该标签可能还有其他 script 标签。

这个想法是定义一个正则表达式,用于 定位元素 BeautifulSoup 和提取 email 值:

 import re

from bs4 import BeautifulSoup

data = """
<body>
    <script>jQuery(window).load(function () {
      setTimeout(function(){
        jQuery("input[name=Email]").val("name@email.com");
      }, 1000);
    });</script>
</body>
"""
pattern = re.compile(r'\.val\("([^@]+@[^@]+\.[^@]+)"\);', re.MULTILINE | re.DOTALL)
soup = BeautifulSoup(data, "html.parser")

script = soup.find("script", text=pattern)
if script:
    match = pattern.search(script.text)
    if match:
        email = match.group(1)
        print(email)

打印: name@email.com

在这里,我们 对电子邮件地址使用了一个简单的正则表达式,但我们可以更进一步,对其进行更严格的处理,但我怀疑这对这个问题是否有实际必要。

原文由 alecxe 发布,翻译遵循 CC BY-SA 3.0 许可协议

我遇到了类似的问题,问题似乎是调用 script_tag.text 返回一个空字符串。相反,您必须致电 script_tag.string 。也许这在某些版本的 BeautifulSoup 中发生了变化?

无论如何, @alecxe 的回答 对我不起作用,所以我修改了他们的解决方案:

 import re

from bs4 import BeautifulSoup

data = """
<body>
    <script>jQuery(window).load(function () {
      setTimeout(function(){
        jQuery("input[name=Email]").val("name@email.com");
      }, 1000);
    });</script>
</body>
"""
soup = BeautifulSoup(data, "html.parser")

script_tag = soup.find("script")
if script_tag:
  # contains all of the script tag, e.g. "jQuery(window)..."
  script_tag_contents = script_tag.string

  # from there you can search the string using a regex, etc.
  email = re.search(r'\.+val\("(.+)"\);', script_tag_contents).group(1)
  print(email)

这打印 name@email.com

原文由 plowman 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏