从HTML中的script元素内部提取对象键的值

时间:2017-12-15 11:31:32

标签: 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。我怎么能用lxml的beautifulsoup提取它?

3 个答案:

答案 0 :(得分:5)

这总体上是一个有趣的问题 - 从HTML代码中的JavaScript代码中提取内容。

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

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

BeautifulSoup

让我们在这里分解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*周围会有额外的空格)
  • :表示&#34;一个或多个数字&#34;
  • 括号定义capturing group - 这是我们将字符串的特定部分提取到我们然后通过\d+
  • 访问的组中的一种方式

请注意@Evyatar建议的简单.group(1)表达式过于宽泛,您可能很容易出现误报。

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

答案 1 :(得分:4)

您可以使用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 :(得分:1)

如果您想避免使用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