python - 通过 xpath 使用 lxml 解析 html 的问题

标签 python parsing xpath lxml lxml.html

我正在尝试解析来自谷歌交互式网站的数据。它是用 JS 渲染的,因此我使用 Qt 加载要解析的站点。我相信我已经正确加载并呈现了该网站,但由于某种原因,当我执行 xpath 解析代码时,我收到并返回了空列表。

这是我的完整代码:

import sys  
from PyQt4.QtGui import *  
from PyQt4.QtCore import *  
from PyQt4.QtWebKit import *  
from lxml import html 

class Render(QWebPage):  
  def __init__(self, url):  
    self.app = QApplication(sys.argv)  
    QWebPage.__init__(self)  
    self.loadFinished.connect(self._loadFinished)  
    self.mainFrame().load(QUrl(url))  
    self.app.exec_()  

  def _loadFinished(self, result):  
    self.frame = self.mainFrame()  
    self.app.quit() 

url = 'https://www.consumerbarometer.com/en/graph-builder/?question=M1&filter=country:singapore,canada,mexico,brazil,argentina,united_states,bulgaria,austria,belgium,croatia,czech_republic,denmark,estonia,finland,france,germany,greece,hungary,italy,ireland,latvia,lithuania,norway,netherlands,poland,portugal,russia,romania,serbia,slovakia,spain,slovenia,sweden,switzerland,ukraine,united_kingdom,australia,china,israel,hong_kong_sar,japan,korea,new_zealand,malaysia,taiwan,turkey,vietnam'  
#This does the magic.Loads everything
r = Render(url)  
#result is a QString.
result = r.frame.toHtml()

#QString should be converted to string before processed by lxml
formatted_result = str(result.toAscii())

#Next build lxml tree from formatted_result
tree = html.fromstring(formatted_result)

archive_links = tree.xpath('//*[@id="main-page-wrapper"]/div/section/div/section[1]/div/div/graph/div/div[4]/div/div/graph-bar-chart/div[2]/svg/g[1]/g[2]/g[1]/text()')
print archive_links

这是我想要抓取的 html: <text class="bar-text-label" y="22" dy="10">Argentina</text>

有什么想法为什么我会得到 []回到我身边?

最佳答案

您可以制作更短且更可靠的 xpath 表达式,并且必须使用命名空间:

tree.xpath('//text[@class="bar-text-label"]/text()', namespaces={'n': 'http://www.w3.org/2000/svg'})
<小时/>

替代解决方案可能是使用 selenium浏览器自动化包:

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


driver = webdriver.Firefox()
driver.get('https://www.consumerbarometer.com/en/graph-builder/?question=M1&filter=country:singapore,canada,mexico,brazil,argentina,united_states,bulgaria,austria,belgium,croatia,czech_republic,denmark,estonia,finland,france,germany,greece,hungary,italy,ireland,latvia,lithuania,norway,netherlands,poland,portugal,russia,romania,serbia,slovakia,spain,slovenia,sweden,switzerland,ukraine,united_kingdom,australia,china,israel,hong_kong_sar,japan,korea,new_zealand,malaysia,taiwan,turkey,vietnam')

// wait for svg to appear
WebDriverWait(driver, 10).until(EC.visibility_of_element_located((By.TAG_NAME, 'svg')))

for text in driver.find_elements_by_class_name('bar-text-label'):
    print(text.text)

driver.close()

关于python - 通过 xpath 使用 lxml 解析 html 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28325011/

相关文章:

python - SQLAlchemy - 指向同一个表相同属性的多个外键

java - 解析 ArrayList 中的 ArrayList 不起作用。

javascript - 无法在 Node.js 中解析 JSON

sql - XPath 根据 SQL Server xml 中的属性 'A' 获取属性 'B' 的值

python - Python 字符串格式中的位置参数 : str. 格式与 f 字符串

python - 突出显示 NetworkX 中的某些节点/边 - 使用 zip() 的问题

python - 仅着色形状的内部

java - 获取文件过早结束异常

xml - 我如何让 Nokogiri 了解我的 namespace ?

html - 如何使用HTML Agility Pack查找以特定值开头的属性?