【问题标题】:How to get text with no class/id using selenium/python?如何使用 selenium/python 获取没有类/id 的文本?
【发布时间】:2018-09-03 19:07:20
【问题描述】:

我正在尝试使用 python/selenium 从此页面 (https://www.artprice.com/artist/844/hans-arp/lots/pasts) 获取变量列表(日期、大小、介质等)。

对于标题来说,它很容易使用:

titles = driver.find_elements_by_class_name("sln_lot_show")
      for title in titles:
          print(title.text)

但是其他变量似乎是源代码中的文本,没有可识别的 id 或类。

例如,要获取我尝试过的日期:

dates_made = driver.find_elements_by_xpath("//div[@class='col-sm-6']/p[1]")
          for date_made in dates_made:
              print(date_made.get_attribute("date"))

dates_made = driver.find_elements_by_xpath("//div[@class='col-sm-6']/p[1]/date")
           for date_made in dates_made:
               print(date_made.text)

两者都不会产生错误,但不会打印任何结果。

这个没有特定类或id的文本有什么方法吗?

这里是具体的html:

......

<div class="col-xs-8 col-sm-6">
  <p>
   <i><a id="sln_16564482" class="sln_lot_show" href="/artist/844/hans-arp/print-multiple/16564482/vers-le-blanc-infini" title="&quot;Vers le Blanc Infini&quot;" ng-click="send_ga_event_now('artist_past_lots_search', 'select_lot_position', 'title', {eventValue: 1})">
        "Vers le Blanc Infini"
   </a></i>
   <date>
    (1960)
   </date>
  </p>
  <p>
   Print-Multiple, Etching, aquatint,
    <span ng-show="unite_to == 'in'" class="ng-hide">15 3/4 x 18 in</span>
    <span ng-show="unite_to == 'cm'">39 x 45 cm</span>
  </p>

【问题讨论】:

  • 您能否提供所需输出的样本?还要确保你有适当的权限来抓取上述网站。
  • 当然。我只是想在控制台中为每件作品打印一个简单的日期列表,但之前没有看到没有类/id的元素
  • 你可以写一个例子让我们知道你的目标。
  • dates_made = driver.find_elements_by_xpath("//div[@class='col-sm-6']/p[1]/date") for date_made in dates_made: print(date_made.text)我认为这应该打印出类似:1960 1954 1974 1934 等(只是示例)
  • dates 唯一丢失的数据吗?提示:您可以使用 single 反引号 `` somecode `` 来包围代码块,并以另一个反引号结束它。它有助于提高可读性

标签: python html selenium selenium-webdriver web-scraping


【解决方案1】:

渐进模式,下面的 Javascript 将返回你的二维数组(很多和细节 - 0,1,2,8,9 你的索引):

lots = driver.execute_script("[...document.querySelectorAll(".lot .row")].map(e => [...e.querySelectorAll("p")].map(e1 => e1.textContent.trim()))")

经典模式:

lots = driver.find_elements_by_css_selector(".lot .row")
for lot in lots:
    lotNo = lot.find_element_by_xpath("./div[1]/p[1]").get_attribute("textContent").strip()
    title = lot.find_element_by_xpath("./div[2]/i").get_attribute("textContent").strip()
    details = lot.find_element_by_xpath("./div[2]/p[2]").get_attribute("textContent").strip()
    date = lot.find_element_by_xpath("./div[3]/p[1]").get_attribute("textContent").strip()
    country = lot.find_element_by_xpath("./div[3]/p[2]").get_attribute("textContent").strip()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    相关资源
    最近更新 更多