python抓取html中的var变量

想从以下html源码中获取locations变量,可以使用BeautifulSoup和正则表达式来解析。

<script>
  debugger
  var locations = [{"名称":"魔法森林书店","地址":"本丸市棕榈路16号","省市":"小学园区"},
                    {"名称":"迷之咖啡馆","地址":"南方塞纳河畔3号","省市":"艾默尔隆地"},
                    {"名称":"古怪博物馆","地址":"怪兽岛南部港口2号","省市":"幽灵城"},
                    {"名称":"辣味火锅店","地址":"复兴街道100号","省市":"辣椒市"},
                    {"名称":"笑傲江湖武馆","地址":"梦幻村演武场路3号","省市":"武侠镇"}];
</script>

完整代码

from bs4 import BeautifulSoup

# 从网址获取页面信息
url = ' '
html_contents = requests.get(url, headers=headers).text
html_soup = BeautifulSoup(html_contents, 'html.parser')

# 找到<script>标签
script = html_soup.find('script', text=re.compile('var\s+locations\s+=\s+'))

# 提取locations变量的值
result = re.search(r'var\s+locations\s+=\s+(\[.+?\]);', script.string, flags=re.S).group(1)

# 将结果进行格式转换
import json
items = json.loads(result)
print(items)

下面是详细的步骤:

  1. 读入html
url = ' '
html_contents = requests.get(url, headers=headers).text
html_soup = BeautifulSoup(html_contents, 'html.parser')
  1. 找到script标签
script = html_soup.find('script', text=re.compile('var\s+locations\s+=\s+'))

在这个代码片段中,text参数被设置成一个正则表达式,它会在HTML文档中查找第一个文本内容匹配该正则表达式的标签。

在本次任务中,所需的匹配条件为标签文本内容中包含 "var locations = "这个字符串;因此正则表达式的内容为

var\s+locations\s+=\s+

这个正则表达式包含以下信息:

  • var: 文本内容包含 var 字符串
  • \s+: + 表示匹配前面的空白字符(空格、制表符、回车等等),\s 是一个特殊符号,表示一个空白字符(空格、制表符、回车等等)。\s+ 表示匹配一个或多个空白字符
  • locations: 文本内容包含 locations 字符串
  1. 从script标签中提取location变量的值
result = re.search(r'var\s+locations\s+=\s+(\[.+?\]);', script.string, flags=re.S).group(1)

re.search()方法的正则表达式var\s+locations\s+=\s+(\[.+?\]);中使用了圆括号()将需要提取的结果包裹起来,因此我们可以使用group(1)来提取这个结果

  • script.string 表示 script 标签中第一段连续的文本,此处用script.text代替亦可
  • 在这个例子中,var\s+locations\s+=\s+我们之前提到过,接下来的(\[.+?\]) 组成如下:
    • [.+?]是这个正则表达式的一个捕获组,它表示匹配一个左中括号和一个右中括号之间的任意字符
    • 接下来只需要使用一个圆括号来包裹。圆括号表示一个捕获组。使用圆括号可以将匹配的内容分组,方便后续操作。在这个例子中,圆括号将\[.+?\] 包含在内,表示将其作为一个整体进行匹配
    • 圆括号内的 \ 则是用来转义 [] 中的字符,使其不被解读为元字符
    • 正则表达式最后的“;”是因为locaitons变量的值是以 ; 结尾,所以加了上去
  1. 将结果从str转为list对象
import json
items = json.loads(result)
print(items)

最终结果以列表的形式展示,列表中每个元素为一条详细数据。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值