我正试图为电影院网站制作一个刮板,以收集电影名称列表。
我尝试使用BeautifulSoup来解析HTML文件,我发现每部电影都在名为"movie-row"
的类中。但是,在此类上使用select
方法并不会检索该站点的相应数据。我能够获得的最接近HTML的组件是.quickbook-section
的父类。
为什么某些HTML标签可以通过BS使用,而另一些则不能?
这是我编写的代码。
def get_movies_names():
url = "https://www.yesplanet.co.il/#/buy-tickets-by-cinema?in-cinema=1025&at=2018-11-09&view-mode=list"
raw_html = util.simple_get(url)
bs = BeautifulSoup(raw_html, 'html.parser')
bs.select(".movie-row")
({simple_get
只是一个返回HTML响应内容的函数)
答案 0 :(得分:5)
似乎特定的网站正在使用JavaScript渲染电影数据。
漂亮的汤不是浏览器,因此没有DOM,因此无法运行JavaScript代码。它所做的只是获取页面内容并进行解析。如果您查看有问题的页面的源代码并查看源代码(在大多数浏览器中右键单击“查看源代码”)并搜索.movie-row
,将会发现没有匹配项。
在这种情况下,您将不得不寻找替代数据的方法,尝试调查它使用的JavaScript代码的作用并从那里开始。另外,您可能想看看使用Selenium和PhantomJS。
答案 1 :(得分:4)
正如一些人指出的那样,它是通过javascript加载的,而BS4并不能真正实现这一点。当您看到通过javascript加载的数据时,可以打赌某个地方有一个API调用。您可以查看并查看它是否在调用JSON对象,以及是否可以在不使用任何apikey的情况下访问JSON对象,而不是尝试抓取数据。
如果您需要其他内容,则可能需要调整一些URL模式。
import requests, json
# Ignore the insecure warning
from requests.packages.urllib3.exceptions import InsecureRequestWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
url = "https://www.yesplanet.co.il/il/data-api-service/v1/poster/10100/by-showing-type/SHOWING?lang=he_IL&ordering=desc"
# Get the page
response = requests.get(url, verify=False)
# Load into json
j = json.loads(response.text)
# process what you want
for poster in j['body']['posters']:
print(poster['url'], poster['featureTitle'])
脚本的输出如下:
/films/bohemian-rhapsody רפסודיה בוהמית
/films/the-other-story סיפור אחר
/films/the-girl-in-the-spiders-web הנערה ברשת העכביש
/films/the-nutcracker-and-the-four-realms מפצח האגוזים וארבע הממלכות
/films/911 11 בספטמבר
/films/virgins אין בתולות בקריות
每个张贴者的可用属性为attributes
,code
,dateStarted
,featureTitle
,mediaList
,posterSrc
,{{1} }和url
。
如果您想知道如何发现URL,请使用chrome开发人员控制台并重新加载页面。过滤XHR(XMLHttpRequest),您将看到包含数据的URL。