使用 BS4 抓取 <script> 标签
Scraping <script> tag with BS4
我是 Python 的新手,正在尝试开发一个简单的网络抓取工具。我在 HTML 中抓取脚本标签时遇到问题。这是我的代码:
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re
link = "https://yeezysupply.com/products/womens-mule-pvc-clear"
def get_variants():
url1 = Request(link, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36'
'(KHTML, like Gecko) Chrome/56.0.2924.28 Safari/537.36'})
url2 = urlopen(url1)
soup = BeautifulSoup(url2, 'html.parser')
variants = soup.find(string=re.compile(r'\bid\s*:\s(\d{11}),\s*parent_id'))
print(variants)
if __name__ == '__main__':
get_variants()
当前代码returns:
KANYE.p.variants.push({
id : 38844706759,
parent_id : 9876888199,
available : true,
featured_image : null,
public_title : null,
requires_shipping : true,
price : 62500,
options : ["35"],
option1 : "35",
option2 : "",
option3 : "",
option4 : ""
});
KANYE.p.variants.push({
id : 38844706887,
parent_id : 9876888199,
available : true,
featured_image : "\/\/cdn.shopify.com\/s\/files\/1\/1765\/5971\/products\/KW3029.001_Side1_650xx.jpg?v=1488326253",
public_title : null,
requires_shipping : true,
price : 62500,
options : ["35.5"],
option1 : "35.5",
option2 : "",
option3 : "",
option4 : ""
});
KANYE.p.variants.push({
id : 38844706951,
parent_id : 9876888199,
available : true,
featured_image : null,
public_title : null,
requires_shipping : true,
price : 62500,
options : ["36"],
option1 : "36",
option2 : "",
option3 : "",
option4 : ""
});
...
我只想抓取 "id" 及其值。所以我需要抓取 id:38844706759,id:38844706887,id:38844706951。这怎么可能?我已经这样做了很长一段时间,但我仍然感到困惑。
BeautifulSoup 无法解析脚本标签。仅在其中找到与您的查询匹配的文本(因为它们是顶级元素的一部分。)。
在 variants = soup.find(string=re.compile(r'\bid\s*:\s(\d{11}),\s*parent_id'))
之后,您可以执行正则表达式 findall 来查找 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'...]
我是 Python 的新手,正在尝试开发一个简单的网络抓取工具。我在 HTML 中抓取脚本标签时遇到问题。这是我的代码:
from urllib.request import Request, urlopen
from bs4 import BeautifulSoup
import re
link = "https://yeezysupply.com/products/womens-mule-pvc-clear"
def get_variants():
url1 = Request(link, headers={'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36'
'(KHTML, like Gecko) Chrome/56.0.2924.28 Safari/537.36'})
url2 = urlopen(url1)
soup = BeautifulSoup(url2, 'html.parser')
variants = soup.find(string=re.compile(r'\bid\s*:\s(\d{11}),\s*parent_id'))
print(variants)
if __name__ == '__main__':
get_variants()
当前代码returns:
KANYE.p.variants.push({
id : 38844706759,
parent_id : 9876888199,
available : true,
featured_image : null,
public_title : null,
requires_shipping : true,
price : 62500,
options : ["35"],
option1 : "35",
option2 : "",
option3 : "",
option4 : ""
});
KANYE.p.variants.push({
id : 38844706887,
parent_id : 9876888199,
available : true,
featured_image : "\/\/cdn.shopify.com\/s\/files\/1\/1765\/5971\/products\/KW3029.001_Side1_650xx.jpg?v=1488326253",
public_title : null,
requires_shipping : true,
price : 62500,
options : ["35.5"],
option1 : "35.5",
option2 : "",
option3 : "",
option4 : ""
});
KANYE.p.variants.push({
id : 38844706951,
parent_id : 9876888199,
available : true,
featured_image : null,
public_title : null,
requires_shipping : true,
price : 62500,
options : ["36"],
option1 : "36",
option2 : "",
option3 : "",
option4 : ""
});
...
我只想抓取 "id" 及其值。所以我需要抓取 id:38844706759,id:38844706887,id:38844706951。这怎么可能?我已经这样做了很长一段时间,但我仍然感到困惑。
BeautifulSoup 无法解析脚本标签。仅在其中找到与您的查询匹配的文本(因为它们是顶级元素的一部分。)。
在 variants = soup.find(string=re.compile(r'\bid\s*:\s(\d{11}),\s*parent_id'))
之后,您可以执行正则表达式 findall 来查找 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'...]