使用BS4刮取<script>标记

时间:2017-04-24 08:21:56

标签: python python-3.x beautifulsoup bs4

我是Python新手并尝试开发一个简单的Web scraper。我在HTML中抓取脚本标记时遇到问题。这是我的代码:

&#xA;&#xA;&#xA;
 来自urllib.request import request,urlopen&#xA;来自bs4 import BeautifulSoup&#xA; import re&#xA;&#xA; link =“https://yeezysupply.com/products/womens-mule-pvc-clear"

def get_variants():&#xA; url1 =请求(link,headers = {'User-Agent':'Mozilla / 5.0(Macintosh; Intel Mac OS X 10_12_2)AppleWebKit / 537.36'&#xA;'(KHTML,如Gecko)Chrome / 56.0.2924.28 Safari / 537.36' })&#XA; url2 = urlopen(url1)&#xA;汤= BeautifulSoup(url2,'html.parser')&#xA; variants = soup.find(string = re.compile(r'\ bid \ s *:\ s(\ d {11}),\ s * parent_id'))&#xA; print(variants)&#xA;&#xA; if __name__ =='__ main __':&#xA; get_variants()&#xA;  
&#xA;&#xA;

代码当前返回:

&#xA;&#xA;
  KANYE .p.variants.push({&#xA; id:38844706759,&#xA; parent_id:9876888199,&#xA;可用:true,&#xA; featured_image:null,&#xA; public_title:null,&# xA; requires_shipping:true,&#xA; price:62500,&#xA; options:[“35”],&#xA; option1:“35”,&#xA; option2:“”,&#xA; option3 :“”,&#xA; option4:“”&#xA;});&#xA;&#xA; KANYE.p.variants.push({&#xA; id:38844706887,&#xA; parent_id: 9876888199,&#xA;可用:true,&#xA; featured_image:“\ / \ / cdn.shopify.com \ / s \ / files \ / 1 \ / 1765 \ / 5971 \ / products \ /KW3029.001_Side1_650xx。 jpg?v = 1488326253“,&#xA; public_title:null,&#xA; requires_shipping:true,&#xA; price:62500,&#xA; options:[”35.5“],&#xA; option1:” 35.5“,&#xA;选项2:”“,&#xA;选项3 :“”,&#xA; option4:“”&#xA;});&#xA;&#xA; KANYE.p.variants.push({&#xA; id:38844706951,&#xA; parent_id:9876888199,&#xA;可用: true,&#xA; featured_image:null,&#xA; public_title:null,&#xA; requires_shipping:true,&#xA; price:62500,&#xA; options:[“36”],&#xA; option1:“36”,&#xA; option2:“”,&#xA; option3:“”,&#xA; option4:“”&#xA;});&#xA; ...&#xA;  
&#xA;&#xA;

我试图只抓“id”及其价值。所以我需要scrape id:38844706759,id:38844706887,id:38844706951。这怎么可能?我已经在这一段时间了,我仍然感到困惑。

&#XA;

1 个答案:

答案 0 :(得分:1)

BeautifulSoup无法解析脚本标记。只查找与您的查询匹配的文本(因为它们是顶级元素的一部分。)。

在您variants = soup.find(string=re.compile(r'\bid\s*:\s(\d{11}),\s*parent_id'))后,您可以执行正则表达式查找ID标记。

variants = soup.find_all(string=re.compile(r'\bid\s*:\s(\d{11}),\s*parent_id'))
for variant in variants:
    print (re.findall(r'id\s+:.(.*?),', variant,  re.MULTILINE))

哪个输出

[u'9876888199', u'38844706759', u'9876888199'...]