【问题标题】:lxml xpath() not returning what I expectlxml xpath() 没有返回我所期望的
【发布时间】:2017-03-14 11:41:27
【问题描述】:

我正在按照指南 (http://docs.python-guide.org/en/latest/scenarios/scrape/) 抓取网站 (https://www.brookfieldproperties.com/portfolio/toronto/bay-adelaide-east/) 并浏览了 lxml 包网站,但不知道出了什么问题。

我有这个代码:

from lxml import html
import requests

page = requests.get('https://www.brookfieldproperties.com/portfolio/toronto/bay-adelaide-east/')
tree = html.fromstring(page.content)

floor = tree.xpath('//div[@class="column floor"]/text()')
sf = tree.xpath('//div[@class="column rsf"]/text()')

但是 floorsf 返回 '\n\t\t\t\t' 值的列表,而不是您期望查看的整数来自实际网站的 html(以下情况下为“20”和“5117”):

<div class="availabilityWrap">
    <h3>Availabilities</h3>

    <div class="availabilityRow headerRow">
        <div class="column floor">

            <a href="/media/img/asset/pdf/BAC-ET-_20th_Floor_-_5100sf.pdf"
 target='blank'><img src="/static/images/pdf.png" class="floorPDF" />20</a>

    </div>
        <div class="column rsf">
            <p><b>5117</b></p>
        </div>
        <div class="column divisible">
            <p><b>yes</b></p>
        </div>
        <div class="column date">
            <p><b>05/01/2017</b></p>
        </div>
        <div class="column space">
            <p><b>Office</b></p>
        </div>
        <div class="column description">
            <p><b>model suite</b></p>
        </div>
        <div class="column rent">
            <p><b>$26.55</b></p>
        </div>
    </div>

不应该只返回“column floor” div 类中的所有文本吗?任何帮助都会很棒。

【问题讨论】:

    标签: python html web-scraping lxml


    【解决方案1】:
    floor = tree.xpath('normalize-space(//div[@class="column floor"])')
    

    div 包含\n\t 以获取新行和空格,这些也是文本,您可以使用normalize-space() 函数连接所有文本并删除空格

    In [14]: '''<div class="column floor">
    ...: 
    ...:             <a href="/media/img/asset/pdf/BAC-ET-_20th_Floor_-_5100sf.pdf"
    ...:  target='blank'><img src="/static/images/pdf.png" class="floorPDF" />20</a>
    ...: 
    ...:     </div>'''
    Out[14]: '<div class="column floor">\n\n            <a href="/media/img/asset/pdf/BAC-ET-_20th_Floor_-_5100sf.pdf"\n target=\'blank\'><img src="/static/images/pdf.png" class="floorPDF" />20</a>\n\n    </div>'
    

    编辑:

    for div in tree.xpath('//div[@class="column floor"]'):
        print(div.xpath('normalize-space(.)')) # `.` means current node
    

    【讨论】:

    • 谢谢!这部分奏效了;它在名为“column floor”的 div 类中提取了第一个文本实例,但页面中还有许多其他我希望包含在列表中的内容。有什么想法吗?
    猜你喜欢
    • 2021-05-30
    • 1970-01-01
    • 2021-12-11
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    相关资源
    最近更新 更多