2016-05-05 42 views
0

新手的蟒蛇,想使用LXML +的XPath从网页中获取视频链接,我现在拥有的是:使用python lxml + xpath从页面获取视频,获取列表但无法打印出结果?

import urllib2 
from lxml import etree 

url=u"http://hkdramas.se/fashion-war-%E6%BD%AE%E6%B5%81%E6%95%99%E4%B8%BB-episode-20/" 
xpath=u"//script[contains(.,'label:\"360p\"')]" 

html=urllib2.urlopen(url).read() 
selector=etree.HTML(html) 
get=selector.xpath(xpath) 

print get 

我已经checke的gettype(),这说明我是一个list,但是当我print get,它显示我意想不到的[<Element script at 0x2a34b88>],这是什么意思?以及如何提取视频的实际url而不是Element script


终于,我得到了,为什么我有这个问题,谢谢@unutbu

xpath=u"//script[contains(.,'label:\"360p\"')]" 

应该

xpath=u"//script[contains(.,'label:\"360p\"')]//text()" 

其中新增text()以确保回报只有文字,而不是元素,在选择元素下,请注意//,以便在选择中有许多子元素时兼容。

回答

0

selector.xpath(xpath)返回标签列表(或更准确地说,Element s)。当您打印对象列表时,Python会显示这些对象的repr<Element script at 0x2a34b88>scriptElementrepr

如果eltscriptElement,然后 elt.text将返回<script>标签内的文本,但你需要使用其他的东西(除了LXML)来提取文本中的网址。你可以,例如,使用正则表达式模式r'"(http[^"]+)"'搜索与"http开始,一直持续到另一双引号,"文本,发现:

import re 
import lxml.html as LH 

url = u"http://hkdramas.se/fashion-war-%E6%BD%AE%E6%B5%81%E6%95%99%E4%B8%BB-episode-20/" 
xpath = u"""//script[contains(.,'label:"360p"')]""" 
root = LH.parse(url) 
for elt in root.xpath(xpath): 
    for url in re.findall(r'"(http[^"]+)"', elt.text): 
     print(url) 

产量

http://hkdramas.se/wp-content/plugins/BSplugin-version-1.2/lib/grab.php?link1=NS71jbj8NVNANTN7N0Nq7Y7FjeN0NojTN47HNcN77_Nhjh7INm7ONLNijCNc7-7UN_NXNCjcNYjeNwNF7uNQNA7dNvNm7-Nr7vNW7-NtjN72N4jVNCN8NfN-NANm7l7rNP7ff5aa877861da31d8cc9dd087d6ce2417fb1308a676a771b787adbffbaa4a0bffNfNHjtj-N6NDNg7HjLND7F7fjMj.jVjKN1N-jMj7NXj7jNNyjTNwjgjmji7INANtNONsN2NvN6jMNaNTNdNlNON8j7N~NEjO7lNyN.jQNaNuN1NYNjjzNnNENUNmNm7Z707dNaNTNFN0N6N8N.NRNuN_7dNtjhjJN-jmNZNpjjNo7fNHjTNNNSNLjMNqNUjN7IN7NPNfNENKN3jT7dNs&link2= 
http://hkdramas.se/wp-content/plugins/BSplugin-version-1.2/lib/grab.php?link1=NvNeNVN4N276Nz7JNSjz7lNLNvNV7Ij3Nx7FNn7.Ni7FNU76NDNMN.NqNkNo7QNKNINiNhjPNJjmNKjPNGN.No7B7BNC7Y7B7B7lN67tjb7JNJNT7rNANrNBN7N6Nt7lN1ND0ba06b7bac4bab5fbb42dbff6c27647ea71b4f725a0c73f175eadf3b459424edN0NBNvNZj77wNL7Wj_j_71NnN0jpNfjPNqNvjDN.jEN4NRNDjijejmjXNINqNijEjENKNfNdN3jiNDNOjcNyN4NwNzN4NqNlNqNAjDNQNBN0Nk7a7Rj8NXN_NiN6NFNmNmNLNwNm7YN7j77vNfNpNljw7HjENRjmNMjVNLNEjq7BN0NON57JNyNyjpN8Nbjz7lN-NfNYNMN.7IjD7.NQ&link2= 

注意,你做不需要导入urllib2。您可以直接将url传递给LH.parse


要获得唯一的后面是字符串'360p'的网址,你可以使用

for url in re.findall(r'"(http[^"]+).*360p"', elt.text): 
    print(url) 
+0

感谢快速和详细的答复,虽然我不熟悉的're'模块,我想我可以赶上这个。但是xpath的解释部分非常有用,谢谢。我会把我的解决方案放在OP上。 – anyone