href属性为空,使用xpath(python3)

时间:2017-03-20 11:32:43

标签: html python-3.x xpath web-scraping href

在python3中使用chrome和xpath,我尝试提取" href"属性on this web page。 " HREF"属性包含电影预告片的链接(" bande-annonce"法语)我感兴趣。

Here is the html of the page, with the href I want in the <a> tag (highlighted in blue)

首先,使用xpath,它似​​乎是&#34; a&#34;标签是&#34; span&#34;标签。实际上,使用此代码:

response_main=urllib.request.urlopen("http://www.allocine.fr/film/fichefilm_gen_cfilm=231874.html")
htmlparser = etree.HTMLParser()
tree_main = etree.parse(response_main, htmlparser)
tree_main.xpath('//*[@id=\"content-start\"]/article/section[3]/div[2]/div/div/div/div[1]/*')

我得到了这个结果:

[<Element span at 0x111f70c08>]

所以&#34; div&#34;标签不包含&#34; a&#34;标签,但只是一个&#34; span&#34;标签。我已经读过浏览器中的html可视化并不总能反映出真实的&#34;服务器发送的HTML。因此我尝试使用此命令来提取href:

    response_main=urllib.request.urlopen("http://www.allocine.fr/film/fichefilm_gen_cfilm=231874.html")
htmlparser = etree.HTMLParser()
tree_main = etree.parse(response_main, htmlparser)
tree_main.xpath('//*[@id=\"content-start\"]/article/section[3]/div[2]/div/div/div/div[1]/span/@href')

不幸的是,这没有任何回报......当我检查&#34; span&#34;使用此命令标记:

tree_main.xpath('//*[@id=\"content-start\"]/article/section[3]/div[2]/div/div/div/div[1]/span/@*')

我得到了&#34;类&#34;的价值。属性,但没有关于&#34; href&#34; ...:

['ACrL3ZACrpZGVvL3BsYXllcl9nZW5fY21lZGlhPTE5NTYwMDcyJmNmaWxtPTIzMTg3NC5odG1s meta-title-link']

我想帮助了解这里发生的事情。为什么&#34; a&#34;标签是&#34; span&#34;标签?对我来说最重要的问题是,如何提取&#34; href&#34;属性?

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:2)

JavaScript动态生成的必需链接。使用urllib.request,您可以在执行HTML后需要HTML时获得初始JavaScript页面来源。

您可以使用selenium + chromedriver来获取动态生成的内容:

from selenium import webdriver as web
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait 

driver = web.Chrome("/path/to/chromedriver")
driver.get("http://www.allocine.fr/film/fichefilm_gen_cfilm=231874.html")
link = wait(driver, 10).until(EC.presence_of_element_located((By.XPATH, "//div[@class='meta-title']/a[@class='xXx meta-title-link']")))
print(link.get_attribute('href'))