Как собрать один элемент из двух элементов, имеющих одинаковый набор атрибутов и одинаковую иерархию в исходном коде html (используя красивый суп из python) - PullRequest
0 голосов
/ 26 июня 2018

This is the source code of IMDB website

Я хочу удалить элемент, выделенный синим цветом на изображении. Этот элемент представляет собой «нет голосов» для конкретного фильма. Когда я пытаюсь его очистить, я также получаю нижний элемент изображения, который представляет «коллекции» для этого фильма, потому что оба элемента имеют одинаковые атрибуты и одинаковую иерархию. Есть ли способ извлечь только выделенный элемент?

Ответы [ 4 ]

0 голосов
/ 26 июня 2018

Я думаю, parsel - лучший html-пакет с поддержкой xpath.

from parsel import Selector

s = Selector(text=html)
nv_data = s.xpath('//span[@name="nv"]/@data-value').extract_first()
0 голосов
/ 26 июня 2018

Вы можете использовать что-то вроде этого (при условии, что вы используете BeautifulSoup):

soup = BeautifulSoup('yourhtml', 'lxml')
p_sort = soup.find('p', {'class':'sort-num_votes-visible'})
req_span = p_sort.find_all('span', {'name':'nv'})[0]

req_span будет содержать тег, о котором вы спрашивали.

0 голосов
/ 26 июня 2018

Если порядок этих 2 одинаковых элементов span одинаков, то вы можете выбрать первый элемент результата или использовать .find () вместо .find_all () [0].

0 голосов
/ 26 июня 2018

Одним из подходов может быть итерация по всем братьям и сестрам <p class="sort-num_votes-visible">, и если вы найдете <span name="nv">, окруженные <span class="text-muted"> и <span class="ghost">, то это должен быть искомый промежуток. Это, конечно, подразумевает, что структура этого фрагмента HTML всегда одинакова. Если один из этих span s может отсутствовать, то этот метод явно не работает.

Если гарантируется, что эти два пролета всегда есть, и в этом точном порядке вы могли бы сделать что-то вроде этого (ваш сложный HTML-код в html_soup):

votes = html_soup.find("p", {"class": "sort-num_votes-visible").find_all("span", {"name": "nv"})[0]

EDIT:

Согласно вашему комментарию, вы можете сделать следующее для разбора голосов за несколько фильмов:

for p in html_soup.find("p", {"class": "sort-num_votes-visible"}):
    votes = p.find_all("span", {"name": "nv"})[0]

    < Put whatever code here for each of your movies
      ...
    >
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...