0

我正在使用美丽的汤在 python 中写入网络抓取,以获得票房金额 6430 万美元。但我无法这样做。

<ul class="content-meta info">
                
                
                <li class="meta-row clearfix" data-qa="movie-info-item">
                    <div class="meta-label subtle" data-qa="movie-info-item-label">Box Office (Gross USA):</div>
                    <div class="meta-value" data-qa="movie-info-item-value">$64.3M</div>
                </li>
                
                
                <li class="meta-row clearfix" data-qa="movie-info-item">
                    <div class="meta-label subtle" data-qa="movie-info-item-label">Runtime:</div>
                    <div class="meta-value" data-qa="movie-info-item-value">
                        <time datetime="P2h 4mM">
                            2h 4m
                        </time>
                    </div>
                </li>
                
                
                <li class="meta-row clearfix" data-qa="movie-info-item">
                    <div class="meta-label subtle" data-qa="movie-info-item-label">Distributor:</div>
                    <div class="meta-value" data-qa="movie-info-item-value">
                        
                        Universal Pictures
                        
                    </div>
                </li>
                
                
                <li class="meta-row clearfix" data-qa="movie-info-item">
                    <div class="meta-label subtle" data-qa="movie-info-item-label">Production Co:</div>
                    <div class="meta-value" data-qa="movie-info-item-value">
                        
                        Universal Pictures, 
                        
                        Blumhouse Productions, 
                        
                        Dark Universe, 
                        
                        Goalpost Pictures
                        
                    </div>
                </li>
                
                
                <li class="meta-row clearfix" data-qa="movie-info-item">
                    <div class="meta-label subtle" data-qa="movie-info-item-label">Sound Mix:</div>
                    <div class="meta-value" data-qa="movie-info-item-value">
                        Dolby Atmos
                    </div>
                </li>
                
                
                <li class="meta-row clearfix" data-qa="movie-info-item">
                    <div class="meta-label subtle" data-qa="movie-info-item-label">Aspect Ratio:</div>
                    <div class="meta-value" data-qa="movie-info-item-value">
                        Scope (2.35:1)
                    </div>
                </li>
                
                
            </ul>

我尝试了多种语法,但没有任何效果。

z = soup.find("ul").get("movie-info-item-value")

for tag in soup.find_all("ul"): print("{0}: {1}".format(tag.name, tag.text))

x = soup.select('movie-info-item-value')

x = soup.select('class').get('movie-info-item-value')

我是 python 和网络抓取的新手。任何帮助将不胜感激。蒂亚!!

4

2 回答 2

0

您可以在 find() 和 find_all() 中指定目标属性,以将<ul>具有类属性和“内容元信息”值的元素与要匹配的属性的class_快捷方式或字典对象进行匹配。

尝试这个:

from bs4 import BeautifulSoup

html = '''
<ul class="content-meta info">                                
    <li class="meta-row clearfix" data-qa="movie-info-item">
        <div class="meta-label subtle" data-qa="movie-info-item-label">Box Office (Gross USA):</div>
        <div class="meta-value" data-qa="movie-info-item-value">$64.3M</div>
    </li>
    ...
</ul>'''

soup = BeautifulSoup(html, "html.parser")
elt = soup.find("ul", class_="content-meta info")\
          .find('li', {'data-qa': 'movie-info-item'})\
          .find('div', class_="meta-value")
print(elt.text)

如果 HTML 有多个具有相同类的“ul”元素,则尝试此操作以首先找到 Box Office 元素。

elt = (soup
       .find(text="Box Office (Gross USA):")
       .parent
       .parent
       .find('div', class_="meta-value")
       )
print(elt.text)

输出:

$64.3M
于 2021-08-29T00:24:32.727 回答
0

与 XPath 语法比较(使用lxml):

from lxml import html

....

tree = html.fromstring(content) # content here is a HTML content of your page
box_office = tree.xpath('string(//div[@data-qa="movie-info-item-label"][contains(., "Box Office")]/following-sibling::div[1]/text())')

我有一个表达式,它以简单的人类方式提取您需要的信息(找到一个具有预定义属性并包含一些预定义文本的div标签,然后提取以下文本)。恕我直言,与 CSS 选择器相比更具可读性。data-qadiv

于 2021-08-29T02:04:29.717 回答