Python - проблема XPath при очистке веб-сайта IMDb - PullRequest
0 голосов
/ 08 сентября 2018

Я пытаюсь очистить фильмы на IMDb с помощью Python, и я могу получить данные обо всех важных аспектах, кроме имен актеров.

Вот пример URL, над которым я работаю:

https://www.imdb.com/title/tt0106464/

Используя функциональность браузера "Inspect", я обнаружил XPath, относящийся ко всем именам актеров, но когда запускается код на Python, похоже, что XPath недействителен (ничего не возвращает).

Вот простая версия кода, который я использую:

import requests
from lxml import html

movie_to_scrape = "https://www.imdb.com/title/tt0106464"
timeout_time = 5

IMDb_html = requests.get(movie_to_scrape, timeout=timeout_time)
doc = html.fromstring(IMDb_html.text)
actors = doc.xpath('//table[@class="cast_list"]//tbody//tr//td[not(contains(@class,"primary_photo"))]//a/text()')
print(actors)

Я много раз пытался изменить XPath, пытаясь сделать его более общим, а затем более конкретным, но он все равно ничего не возвращает

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Изучив HTML, начнем с простого xpath, например //td[@class="primary_photo"]

<table class="cast_list">    
  <tr><td colspan="4" class="castlist_label">Cast overview, first billed only:</td></tr>
      <tr class="odd">
          <td class="primary_photo">
<a href="/name/nm0000418/?ref_=tt_cl_i1"
><img height="44" width="32" alt="Danny Glover" title="Danny Glover" src="https://m.media-amazon.com/images/G/01/imdb/images/nopicture/32x44/name-2138558783._CB470041625_.png" class="loadlate hidden " loadlate="https://m.media-amazon.com/images/M/MV5BMTI4ODM2MzQwN15BMl5BanBnXkFtZTcwMjY2OTI5MQ@@._V1_UY44_CR1,0,32,44_AL_.jpg" /></a>          </td>
          <td>

ПИТОН:

for photo in doc.xpath('//td[@class="primary_photo"]'):
    print photo
0 голосов
/ 08 сентября 2018

Не принимайте вслепую структуру разметки, которую вы видите, используя inspect element.
Браузер очень снисходительный и постарается исправить любую проблему с разметкой в ​​источнике.
С учетом вышесказанного, если вы проверите источник, используя view source, вы увидите, что таблица, которую вы связываете для очистки, не имеет <tbody>, поскольку они вставляются браузером.
Так что, если вы удалили его здесь //table[@class="cast_list"]//tbody//tr//td[not(contains(@class,"primary_photo"))]//a/text() -> //table[@class="cast_list"]//tr//td[not(contains(@class,"primary_photo"))]//a/text()
Ваш запрос должен работать.

...