【发布时间】:2019-07-02 19:52:20
【问题描述】:
我正在 Rotten Tomatoes 网站上为example here做一些网页抓取。
我将 Python 与 Beautiful Soup 和 lxml 模块一起使用。
我想提取电影信息,例如: - 类型:戏剧、音乐和表演艺术
导演:Kirill Serebrennikov
作者:Mikhail Idov、Lili Idova、Ivan Kapitonov、Kirill Serebrennikov、Natalya Naumenko
作者(链接):/celebrity/michael_idov、/celebrity/lily_idova、/celebrity/ivan_kapitonov、/celebrity/kirill_serebrennikov、/celebrity/natalya_naumenko
我检查了页面 html 以获取路径指南:
<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 & 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"> 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 & Sky</a>
</div>
</li>
我创建了这样的 html 对象:
page_response = requests.get(url, timeout=5)
page_content = BeautifulSoup(page_response.content, "html.parser")
tree = html.fromstring(page_response.content)
以 Writer 为例,因为我只需要元素上的文本,所以很容易得到:
page_content.select('div.meta-value')[3].getText()
或使用 xpart 进行评分:
tree.xpath('//div[@class="meta-value"]/text()')[0]
对于我遇到问题的所需 Writer 链接,要访问 html 块,我这样做:
page_content.select('div.meta-value')[3]
这给出了:
<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>
或者:
tree.xpath('//div[@class="meta-value"]')[3]
给予:
<Element div at 0x2915a4c54a8>
问题是我无法提取“href”。我想要的输出是:
/celebrity/michael_idov, /celebrity/lily_idova, /celebrity/ivan_kapitonov, /celebrity/kirill_serebrennikov, /celebrity/natalya_naumenko
我试过了:
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]
所有结果为空或错误。 谁能帮我解决这个问题?
提前致谢! 干杯!
【问题讨论】:
-
谢谢。这将返回页面中的所有 href,但是我只想要 page_content.select('div.meta-value')[3] 部分中的那些,对此有什么提示吗?我试过了,但没有成功,比如:for a in page_content.select('div.meta-value')[2]: print("Found the URL:", a['href'])
标签: python html xpath web-scraping beautifulsoup