Получить элементы из таблицы, используя XPath - PullRequest
0 голосов
/ 08 июля 2019

Я пытаюсь получить информацию с этого сайта https://www.realtypro.co.za/property_detail.php?ref=1736

У меня есть эта таблица, из которой я хочу взять количество спален

<div class="panel panel-primary">
    <div class="panel-heading">Property Details</div>
        <div class="panel-body">
            <table width="100%" cellpadding="0" cellspacing="0" border="0" class="table table-striped table-condensed table-tweak">
                <tbody><tr>
                    <td class="xh-highlight">3</td><td style="width: 140px" class="">Bedrooms</td>

                </tr>
                <tr>
                    <td>Bathrooms</td>
                    <td>3</td>
                </tr>

Я использую это выражение xpath:

bedrooms = response.xpath("//div[@class='panel panel-primary']/div[@class='panel-body']/table[@class='table table-striped table-condensed table-tweak']/tbody/tr[1]/td[2]/text()").extract_first()

Тем не менее, я получаю только None в качестве вывода.

Я пробовал несколько комбинаций, и я получаю только None в качестве вывода.Любые предложения о том, что я делаю не так?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 08 июля 2019

Я бы использовал BS4 4.7.1.где вы можете найти с помощью :contains ячейку td с текстом "Bedrooms", а затем взять соседнего брата td.Вы можете добавить тест для is None для обработки ошибок.Менее хрупкий, чем длинный xpath.

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://www.realtypro.co.za/property_detail.php?ref=1736')
soup = bs(r.content, 'lxml')
print(int(soup.select_one('td:contains(Bedrooms) + td').text)

Если позиция была зафиксирована, вы можете использовать

.table-tweak td + td
1 голос
/ 08 июля 2019

Попробуйте и дайте мне знать, если это работает:

import lxml.html

response = [your code above]
beds = lxml.html.fromstring(response)

bedrooms = beds.xpath("//div[@class='panel panel-primary']/div[@class='panel-body']/table[@class='table table-striped table-condensed table-tweak']/tbody/tr[1]/td[2]//preceding-sibling::*/text()")
bedrooms

Выход:

[ '3']

EDIT:

Или, возможно:

for bed in beds:
     num_rooms = bed.xpath("//div[@class='panel panel-primary']/div[@class='panel-body']/table[@class='table table-striped table-condensed table-tweak']/tbody/tr[1]/td[2]//preceding-sibling::*/text()")
     print(num_rooms)
...