【问题标题】:How to locate the certain value of an item using xpath?如何使用 xpath 定位项目的特定值?
【发布时间】:2024-05-03 11:05:02
【问题描述】:

我在python 中结合lxml 库编写了一个脚本,使用xpath 从网页解析某个公寓的值。在该站点中可见的该公寓的名称是Eden Tolly Cascades,它的值是15.92 to 36.28 Lac。我如何解析在我的 xpath 中提及该公寓名称的值?

我已经尝试如下,它可以正常工作,没有任何问题。但是,没有任何更清洁的方法可以达到同样的效果吗?

import requests
from lxml.html import fromstring

url = "https://www.99acres.com/ppc-2515-residential-apartment-mailer"

res = requests.get(url)
tree = fromstring(res.text)
item = tree.xpath("//h1[contains(.,'Eden Tolly')]/../../../following::div//span/strong/text()")[0]
print(item)

这是一个这样的容器:

<div class="pro-text">
    <div class="product-text-box">
        <div class="product-heading">
            <span><img src="https://newprojects.99acres.com/projects/eden_group/eden_tolly_cascades/ln9rkpsb.jpg">
                <h1 class="font-size15">Eden Tolly Cascades<p>Kabardanga</p></h1>
            </span> 
        </div>
    </div>
    <div class="product-text-box">
    <ul class="product-lrg-box">
        <li> <span><strong><span class="rupee-font">₹ &nbsp;</span>15.92 to 36.28 Lac</strong></span></li>
        <li><strong>549-1251 SQFT</strong></li>

        <li><strong>1-3 BHK</strong></li>
        <li style="width:20% !important;"><strong>New Launch</strong></li>
    </ul>
    <div id="tabs" class="tab-link tabs-menu tabs-menu-new">
        <ul>
            <li><a href="#304355broch">e-Brochure</a></li>
            <li><a href="#304355amn">Amenities</a></li>
            <!--  <li style="width:20% !important;"><a href="#304355floor">Floor Plan</a></li>-->
            <li style="width:20% !important;"><a href="#304355dir">Directions</a></li>
        </ul>
    </div>
    <span class="enquire-new-bt" id="304355-583061,151100-enquire-new-bt" data-val="3"> <a href="javascript:void(0)">I am Interested</a> </span> </div>
</div>

【问题讨论】:

  • 您能否分享 HTML 代码示例,因为目标 URL 似乎无法访问(至少对我而言)?
  • 好的,先生。我没注意到你回复了。我非常期待你的出现。将使用相关的 html 进行更新。
  • @sir Andesson,几个月前你为我提供了一个非常棒的xpath,用于解析来自https://finance.yahoo.com/ 的标题,表达式为"//a[u[@class='StretchedBox']]/text()"。但是,我试图按照模式在此处构建相同的内容,但未能成功。
  • 嗯...你可以试试这个//div[contains(.//h1, 'Eden Tolly')]/following-sibling::div//span/strong/text(),但我不确定它真的是“更清晰”...让我知道XPath的哪个部分要简化的表达式
  • 请将其作为答案发布@sir Andersson。这正是我正在寻找的表达方式。

标签: python python-3.x xpath web-scraping lxml


【解决方案1】:

在 XPath 下试试

//div[contains(.//h1, 'Eden Tolly')]/following-sibling::div//span/strong/text()

【讨论】:

  • 先生要知道的一件事:在这种情况下,它们的工作方式相同 following-siblingfollowing。你能告诉我为什么吗?
  • following 匹配不同 DOM 级别的元素(具有不同/相同父级的节点),而 following-sibling 仅在同一级别上(具有相同直接父级的节点)。简单地说,following-sibling 只是following 的更精确版本
最近更新 更多