首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用或lxml xpath从html中获取href

使用或lxml xpath从html中获取href
EN

Stack Overflow用户
提问于 2019-07-02 19:52:20
回答 1查看 3.7K关注 0票数 1

我正在做一些网站刮烂番茄网站,为这里的例子

我将Python与Beautiful和lxml模块一起使用。

我想提取电影信息,例如:类型:戏剧,音乐和表演艺术

  • 导演: Kirill Serebrennikov
  • 作者: Mikhail Idov,Lili Idova,Ivan Kapitonov,Kirill Serebrennikov,Natalya Naumenko
  • 由(链接):/名人/michael、/名人/莉莉_idova、/名人/ivan、/名人/kirill_serebrennikov、/名人/naumenko撰写。

我检查了html页面以获得路径上的指南:

代码语言:javascript
复制
                    <li class="meta-row clearfix">
                        <div class="meta-label subtle">Rating: </div>
                        <div class="meta-value">NR</div>
                    </li>


                    <li class="meta-row clearfix">
                        <div class="meta-label subtle">Genre: </div>
                        <div class="meta-value">

                                <a href="/browse/opening/?genres=9">Drama</a>, 

                                <a href="/browse/opening/?genres=12">Musical &amp; Performing Arts</a>

                        </div>
                    </li>


                    <li class="meta-row clearfix">
                        <div class="meta-label subtle">Directed By: </div>
                        <div class="meta-value">

                                <a href="/celebrity/kirill_serebrennikov">Kirill Serebrennikov</a>

                        </div>
                    </li>


                    <li class="meta-row clearfix">
                        <div class="meta-label subtle">Written By: </div>
                        <div class="meta-value">

                                <a href="/celebrity/michael_idov">Mikhail Idov</a>, 

                                <a href="/celebrity/lily_idova">Lili Idova</a>, 

                                <a href="/celebrity/ivan_kapitonov">Ivan Kapitonov</a>, 

                                <a href="/celebrity/kirill_serebrennikov">Kirill Serebrennikov</a>, 

                                <a href="/celebrity/natalya_naumenko">Natalya Naumenko</a>

                        </div>
                    </li>


                    <li class="meta-row clearfix">
                        <div class="meta-label subtle">In Theaters: </div>
                        <div class="meta-value">
                            <time datetime="2019-06-06T17:00:00-07:00">Jun 7, 2019</time>
                            <span style="text-transform:capitalize">&nbsp;limited</span>
                        </div>
                    </li>




                    <li class="meta-row clearfix">
                        <div class="meta-label subtle">Runtime: </div>
                        <div class="meta-value">
                            <time datetime="P126M">
                                126 minutes
                            </time>
                        </div>
                    </li>


                    <li class="meta-row clearfix">
                    <div class="meta-label subtle">Studio: </div>
                    <div class="meta-value">

                            <a href="http://sonypictures.ru/leto/" target="movie-studio">Gunpowder &amp; Sky</a>

                    </div>

            </li>

我创建了这样的html对象:

代码语言:javascript
复制
    page_response = requests.get(url, timeout=5)
    page_content = BeautifulSoup(page_response.content, "html.parser")
    tree = html.fromstring(page_response.content)

例如,对于Writer,因为我只需要元素上的文本,所以很容易获得:

代码语言:javascript
复制
page_content.select('div.meta-value')[3].getText()

或使用x部件进行评级:

代码语言:javascript
复制
tree.xpath('//div[@class="meta-value"]/text()')[0]

对于需要的Writer链接(在我有问题的地方),要访问html块,我执行以下操作:

代码语言:javascript
复制
page_content.select('div.meta-value')[3]

这意味着:

代码语言:javascript
复制
<div class="meta-value">
<a href="/celebrity/michael_idov">Mikhail Idov</a>, 

                                <a href="/celebrity/lily_idova">Lili Idova</a>, 

                                <a href="/celebrity/ivan_kapitonov">Ivan Kapitonov</a>, 

                                <a href="/celebrity/kirill_serebrennikov">Kirill Serebrennikov</a>, 

                                <a href="/celebrity/natalya_naumenko">Natalya Naumenko</a>

或者:

代码语言:javascript
复制
tree.xpath('//div[@class="meta-value"]')[3]

给予:

代码语言:javascript
复制
<Element div at 0x2915a4c54a8>

问题是我不能提取“href”。我想要的输出是:

代码语言:javascript
复制
/celebrity/michael_idov, /celebrity/lily_idova, /celebrity/ivan_kapitonov, /celebrity/kirill_serebrennikov, /celebrity/natalya_naumenko

我试过:

代码语言:javascript
复制
page_content.select('div.meta-value')[3].get('href')
tree.xpath('//div[@class="meta-value"]')[3].get('href')
tree.xpath('//div[@class="meta-value"]/@href')[3]

所有的结果都为空或错误。有人能帮我吗?

提前感谢!干杯!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-02 21:08:34

尝试下面的脚本来获取您感兴趣的内容。确保通过使用不同的电影来测试它们。我想他们都会产生期望的输出。我试图避免任何硬编码的索引来针对内容。

使用css选择器:

代码语言:javascript
复制
import requests
from bs4 import BeautifulSoup

r = requests.get('https://www.rottentomatoes.com/m/leto')
soup = BeautifulSoup(r.text,'lxml')

directed = soup.select_one(".meta-row:contains('Directed By') > .meta-value > a").text
written = [item.text for item in soup.select(".meta-row:contains('Written By') > .meta-value > a")]
written_links = [item.get("href") for item in soup.select(".meta-row:contains('Written By') > .meta-value > a")]
print(directed,written,written_links)

使用xpath:

代码语言:javascript
复制
import requests
from lxml.html import fromstring

r = requests.get('https://www.rottentomatoes.com/m/leto')
root = fromstring(r.text)

directed = root.xpath("//*[contains(.,'Directed By')]/parent::*/*[@class='meta-value']/a/text()")
written = root.xpath("//*[contains(.,'Written By')]/parent::*/*[@class='meta-value']/a/text()")
written_links = root.xpath(".//*[contains(.,'Written By')]/parent::*/*[@class='meta-value']/a//@href")
print(directed,written,written_links)

在强制转换的情况下,我使用了列表理解,这样我就可以对单个元素使用.strip()来排除空白空间。不过,normalize-space()是实现这一目标的理想选择。

代码语言:javascript
复制
cast = [item.strip() for item in root.xpath("//*[contains(@class,'cast-item')]//a/span[@title]/text()")]
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56859200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档