Неисправность 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 и другие библиотеки будут более эффективными и мощными.