【问题标题】:Extracting a value of an object key from inside the script element in the HTML从 HTML 中的脚本元素内部提取对象键的值
【发布时间】:2018-05-29 14:43:52
【问题描述】:
<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 提取它?

【问题讨论】:

    标签: python beautifulsoup html-parsing lxml


    【解决方案1】:

    您可以使用 BeautifulSoup 提取脚本标签的文本,但要获得 user_id,您需要使用正则表达式

    # Assuming it's the only number in the script's text
    pattern = re.compile('\d+')
    soup = BeautifulSoup(page, 'lxml')
    for i in soup.select('script'):
        print(re.findall(pattern, i.text))
    

    输出

    ['4243456']

    【讨论】:

      【解决方案2】:

      这总体上是一个有趣的问题——从 HTML 代码中的 JavaScript 代码中提取一些东西。

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

      如果您选择正则表达式方法,您实际上可以重新使用正则表达式来定位所需的script 元素并提取所需的变量 (BeautifulSoup @ 987654321@ 查找/过滤元素):

      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+ 表达式过于宽泛,很容易误报。

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

      【讨论】:

        【解决方案3】:

        如果您想避免使用regex,可以选择字符串操作:

        from bs4 import BeautifulSoup
        
        content='''
        <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>
        '''
        soup = BeautifulSoup(content,'lxml')
        item = soup.select('script')[0].text.split('user_id":')[1].split("}")[0]
        print(item)
        

        输出:

        4243456
        

        【讨论】:

          猜你喜欢
          • 2021-03-13
          • 2016-06-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-20
          相关资源
          最近更新 更多