我已经尝试将urllib与Beautifulsoup一起使用。我总是通过使用带有相关标签的汤。选择得到空的结果。 我是Python的新手。非常感谢您的提前帮助!
随附的代码供您参考。
import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import pandas as pd
url="https://www.walmart.com/ip/Twin-Pack-Kellogg-s-Frosted-Mini-Wheats-Breakfast-Cereal-48-Oz/940504168"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")
name_box = soup.select('div.nutrition-facts-all-facts-servingSize.div.span')
print(name_box)
答案 0 :(得分:0)
您选择了一个相当尴尬的页面来开始进行网络抓取,因为您要获取的页面具有很多javascript渲染。因此,您不能简单地将信息传递给BeautfulSoup并获取所需的信息。也就是说,您获得的HTML将不同于在浏览器中查看源代码时看到的HTML。
您可以调查使用诸如硒之类的东西,以通过浏览器获取最终的HTML,然后使用BeautifulSoup对其进行解析。另外,最快的方法是查看所需的信息是否已经埋藏在您拥有的信息中。在这种情况下,您可以将其作为JSON嵌入在返回的<script>
部分之一中。
可以使用以下代码提取JSON:
import urllib.request
from bs4 import BeautifulSoup
import json
import re
url = "https://www.walmart.com/ip/Twin-Pack-Kellogg-s-Frosted-Mini-Wheats-Breakfast-Cereal-48-Oz/940504168"
html = urllib.request.urlopen(url).read()
soup = BeautifulSoup(html, "html.parser")
for script in soup.find_all('script'):
if '_setReduxState' in script.text:
re_json = re.search('__WML_REDUX_INITIAL_STATE__ = ({.*\});}', script.text)
data = json.loads(re_json.group(1))
product_id = data['product']['midasContext']['productId']
print(data['product']['idmlMap'][product_id]['modules']['NutritionFacts'])
这将使您data
拥有一个非常深的JSON结构,其中包含您可能需要的所有信息。我建议打印data
以查看所有可用信息。
例如data['product']['idmlMap'][product_id]['modules']['NutritionFacts']
为您提供了所有的营养信息,但是您可能需要更具体一些以获取所需的确切信息。
此结构中的某些元素包含页面上使用的HTML,因此您可能需要进一步解析其中的某些元素,以提取所需的位。