Этот ответ связан с щедростью by @djechlin
blockquote>. Многие поиски по спецификациям w3 / dom и не нашли ничего окончательного, что конкретно говорит о том, что iframe должен перезагружаться при перемещении в дереве DOM, однако в течение нескольких лет я нашел множество ссылок и комментариев в trac / bugzilla / microsoft webkit относительно различных изменений поведения.
Надеюсь, что кто-то найдет что-то конкретное в отношении этого вопрос, но на данный момент вот мои выводы:
- Согласно Ryosuke Niwa - «Это ожидаемое поведение».
- magic iframe "( webkit, 2010 ), но он был удален в 2012 году .
- Согласно MS -« ресурсы iframe освобождаются, когда удалены из DOM ". Когда вы
appendChild(node)
существующего узла, -node
сначала удаляется из dom. Интересная вещь здесь -IE<=8
не перезагружает iframe - это поведение (несколько) новое (посколькуIE>=9
).- Согласно комментарию Hallvord RM Steen , это - это цитата из спецификаций ifgram . Когда элемент iframe вставлен в документ, в котором есть контекст просмотра, пользовательский агент должен создать новый контекст просмотра, установить контекстный контекст просмотра элемента в недавно созданный контекст просмотра, а затем обрабатывать атрибуты iframe для «первого раза». Это самая близкая вещь, которую я нашел в спецификациях, однако она по-прежнему требует некоторой интерпретации (поскольку, когда мы перемещаем элемент
iframe
в DOM, мы действительно не делаем полногоremove
, даже если браузеры используютnode.removeChild
).
Как указано в комментариях, вам лучше попробовать 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, как вы ожидаете.
Вот рабочее решение, использующее 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))
Мой вывод: (это французский ...)
Les évadés
Le parrain
Темный рыцарь: Le chevalier noir
Le parrain, 2ème partie
Le seigneur des anneaux: Le retour du roi
И этот список можно продолжить ...