Как разобрать название 250 лучших фильмов, используя регулярные выражения в Python

Этот ответ связан с щедростью by @djechlin

blockquote>

. Многие поиски по спецификациям w3 / dom и не нашли ничего окончательного, что конкретно говорит о том, что iframe должен перезагружаться при перемещении в дереве DOM, однако в течение нескольких лет я нашел множество ссылок и комментариев в trac / bugzilla / microsoft webkit относительно различных изменений поведения.

Надеюсь, что кто-то найдет что-то конкретное в отношении этого вопрос, но на данный момент вот мои выводы:

  1. Согласно Ryosuke Niwa - «Это ожидаемое поведение».
  2. magic iframe "( webkit, 2010 ), но он был удален в 2012 году .
  3. Согласно MS -« ресурсы iframe освобождаются, когда удалены из DOM ". Когда вы appendChild(node) существующего узла, - node сначала удаляется из dom. Интересная вещь здесь - IE<=8 не перезагружает iframe - это поведение (несколько) новое (поскольку IE>=9).
  4. Согласно комментарию Hallvord RM Steen , это - это цитата из спецификаций ifgram . Когда элемент iframe вставлен в документ, в котором есть контекст просмотра, пользовательский агент должен создать новый контекст просмотра, установить контекстный контекст просмотра элемента в недавно созданный контекст просмотра, а затем обрабатывать атрибуты iframe для «первого раза». Это самая близкая вещь, которую я нашел в спецификациях, однако она по-прежнему требует некоторой интерпретации (поскольку, когда мы перемещаем элемент iframe в DOM, мы действительно не делаем полного remove, даже если браузеры используют node.removeChild).
0
задан allendom 27 February 2019 в 21:16
поделиться

2 ответа

Как указано в комментариях, вам лучше попробовать BeautifulSoup. Примерно так будет перечисляться названия в Python3:

import requests
from bs4 import BeautifulSoup

html = requests.get('https://www.imdb.com/search/title?groups=top_250&sort=user_rating')
if html.ok:
    soup = BeautifulSoup(html.text, 'html.parser')
    html.close()

for title in soup('h3', 'lister-item-header'):
    print(title('a')[0].get_text())

И вот более чистая версия кода выше:

import requests
from bs4 import BeautifulSoup

imdb_entry_point = 'https://www.imdb.com/search/title'
imdb_payload = {
    'groups': 'top_250',
    'sort': 'user_rating'
}

with requests.get(imdb_entry_point, imdb_payload) as imdb:
    if imdb.ok:
        html = BeautifulSoup(imdb.text, 'html.parser')
        for i, h3 in enumerate(html('h3', 'lister-item-header'), 1):
            for a in h3('a'):
                print(i, a.get_text())

Кстати, эта точка входа возвращает только 50 результатов а не 250, как вы ожидаете.

0
ответ дан accdias 27 February 2019 в 21:16
поделиться

Вот рабочее решение, использующее BeautifulSoup и некоторое неприятное регулярное выражение, но оно работает нормально. Я люблю регулярные выражения, но, кажется, я делаю их странным образом, я могу объяснить вам, как они работают, если хотите.

import re, urllib.request
from bs4 import BeautifulSoup

url = "https://www.imdb.com/search/title?groups=top_250&sort=user_rating"
response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
i = 0
for txt in soup.findAll(attrs={"class" :"lister-item-header"}):
    i += 1
    print(str(i) + " ." + re.match("""^.*>(.*)</a>.*$""", re.sub('"', '', re.sub('\n', '', str(txt)))).group(1))

Мой вывод: (это французский ...)

  1. Les évadés

  2. Le parrain

  3. Темный рыцарь: Le chevalier noir

  4. Le parrain, 2ème partie

  5. Le seigneur des anneaux: Le retour du roi

И этот список можно продолжить ...

0
ответ дан Lyxilion 27 February 2019 в 21:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: