Неисправность Python-запроса

Помогите с питоном пожалуйста. Я попытался очистить веб-страницу с помощью Python. когда я пытаюсь получить iframe src в этом URL, он дает мне только один источник iframe.

Это веб-страница, которую я пытался очистить.


Источник 1



Источник 2


Источник 2

это мой код Python:

iframe = re.compile( '<iframe.*src="(.*?)"' ).findall( html )

этот дает мне только 1 iframe. Но есть 4 кадра

Спасибо

3 ответа

Настоятельно рекомендуется не анализировать HTML с помощью регулярных выражений. Для Python Beautiful Soup - широко используемая опция, которая делает этот анализ за вас.

Для извлечения вашего <iframe/> источники, вы можете использовать что-то вроде этого

from bs4 import BeautifulSoup
import requests

resp = requests.get(url)
soup = BeautifulSoup(resp.text)
for frame in soup.findAll('iframe'):
    print(frame['src'])

Для указанного вами URL это даст следующий результат

http://www.playhd.video/embed.php?vid=xxx
http://mersalaayitten.com/embed/xxx
http://www.playhd.video/embed.php?vid=xxx
http://googleplay.tv/videos/kanithan?iframe=true
//www.facebook.com/plugins/likebox.php?href=https%3A%2F%2Fwww.facebook.com%2Fkathaltamilmovie&width=600&height=188&colorscheme=light&show_faces=true&header=false&stream=false&show_border=true

Если вы просто хотите, чтобы все четыре были вместе, вы можете получить данные из второй таблицы, которая содержит четыре фрейма, используя, в частности, css-селекторы BeautifulSoup. nth-of-type(2) потянуть за второй стол:

from bs4 import BeautifulSoup
import requests

html = requests.get("http://kathaltamil.com/?v=Kanithan").content
soup = BeautifulSoup(html)

urls = [ifr["src"] for ifr in soup.select("table:nth-of-type(2)")[0].select("iframe")]

Что даст вам только четыре:

['http://www.playhd.video/embed.php?vid=621', 
'http://mersalaayitten.com/embed/3752', 
'http://www.playhd.video/embed.php?vid=584', 
'http://googleplay.tv/videos/kanithan?iframe=true']

Или даже проще с lxml и xpath:

import requests

html = requests.get("http://kathaltamil.com/?v=Kanithan").content


from lxml.etree import fromstring, HTMLParser

xml = fromstring(html, HTMLParser())

print(xml.xpath("//table[2]//iframe/@src"))

Что дает вам то же самое:

['http://www.playhd.video/embed.php?vid=621',
 'http://mersalaayitten.com/embed/3752', 
'http://www.playhd.video/embed.php?vid=584', 
'http://googleplay.tv/videos/kanithan?iframe=true']

Все, что вы выберете, будет лучшим вариантом, чем ваше регулярное выражение.

Похоже, вы забыли знак вопроса (?) после первого.* Правильный путь был бы так:

iframe = re.compile( '<iframe.*?src="(.*?)"' ).findall( html )

В целом, имейте в виду, что регулярные выражения не являются хорошим способом анализа html-страниц. Красивый суп, lxml, scrapy и другие библиотеки будут более эффективными и мощными.

Другие вопросы по тегам