Xlen元素在Selenium中不匹配,但在浏览器控制台中匹配

时间:2015-10-15 22:30:12

标签: python html selenium xpath web-scraping

您好我有这个xpath代码,我想获取链接和数据。

<li class="qTile P-14 Bdbx-1g Bgc-w">
<div class="Lh-16  ">
<h3 id="20151012074222AAY5Tdd" class="qstn-title Fz-15 Fw-b Wow-bw"><a data-rapid_p="1" class="Clr-b" data-ylk="slk:qtitle" href="/question/index?qid=20151012074222AAY5Tdd">Google or Yahoo?</a></h3>
<div class="desc">
  Both
</div>
<div class="long-desc Mah-130 Ovy-s D-n">
  Both
</div>
<div class="Fz-12 Clr-888">
    75 answers
    <span class="Fz-14">·</span>
  <a data-rapid_p="2" class="Clr-b" data-ylk="slk:cat" href="/dir/index/discover?sid=2115500141">Google</a>
  <span class="Fz-14">·</span>
  3 days ago
</div>

在这张图片中仅显示数据字段,xpath用于获取问题的链接效果很好。 我尝试使用这个xpath并在浏览器中运行良好,但是当我在Python中使用selenium时,我有xpath错误。

 post_elems = self.driver.find_elements_by_xpath('//li[contains(@class,"qTile P-14 Bdbx-1g Bgc-w")]')

 i = 0
 for post in post_elems:
     data_of_question = post.find_element_by_xpath('.//div[contains(@class,"Fz-12 Clr-888")]/text()[last()]')
     url = post.find_element_by_xpath('.//h3/a[contains(@class,"Clr-b")]')
     url_accodare = url.get_attribute('href')

1 个答案:

答案 0 :(得分:2)

问题是selenium中的 XPath表达式必须指向标记而不是文本节点。换句话说,.//div[contains(@class,"Fz-12 Clr-888")]/text()[last()]表达式是非法的,您必须以不同的方式获取该问题日期。

例如,您可以获取元素的完整文本并使用正则表达式来提取您感兴趣的部分。示例:

import re

value = post.find_element_by_xpath('.//div[contains(@class,"Fz-12 Clr-888")]').text
match = re.search(r"(\d+ days ago)", value)
print(match.group(1))

或者,您也可以抓取元素的outerHTML并通过解析它来获取所需的文本,例如BeautifulSoup

from bs4 import BeautifulSoup

elm = post.find_element_by_xpath('.//div[contains(@class,"Fz-12 Clr-888")]')
data = elm.get_attribute("outerHTML")

soup = BeautifulSoup(data)
print(soup.find_all(text=True)[-1])

当然,还有其他选项可以提取所需的文本节点。