无法使用BeautifulSoup查找特定的类组件

时间:2018-11-09 14:58:14

标签: python web-scraping beautifulsoup

我正试图为电影院网站制作一个刮板,以收集电影名称列表。 我尝试使用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响应内容的函数)

2 个答案:

答案 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 אין בתולות בקריות

每个张贴者的可用属性为attributescodedateStartedfeatureTitlemediaListposterSrc,{{1} }和url

如果您想知道如何发现URL,请使用chrome开发人员控制台并重新加载页面。过滤XHR(XMLHttpRequest),您将看到包含数据的URL。