Отбор по определенным критериям, когда аналогичные классы используются в HTML-источнике - PullRequest
1 голос
/ 20 апреля 2019

Я пытаюсь очистить 8 экземпляров x между тегами td на следующих

<th class="first"> Temperature </th>
<td> x </td> # repeated for 8 lines

Однако на странице имеется множество классов, которые <th class="first"> Единственным уникальным идентификатором является строка, которая следует первой, в данном примере Температура.

Не уверен, что добавить к следующему коду, который я использую, чтобы создать какой-то критерий для очистки <th class="first">, где температура (и другие строки следуют)

for tag in soup.find_all("th", {"class":"first"}):
    temps.append(tag.text)

Это вопрос дополнительного кода (re.compile?) Или я должен использовать что-то другое полностью?

Редактировать: интересующий HTML ниже

   <tbody>
<tr>
    <th class="first">Temperature</th>
    <td>x</td>
    <td>x</td>
    <td>x</td>
    <td>x</td>
    <td>x</td>
    <td>x</td>
    <td>x</td>
    <td>x</td>
</tr>

Редактировать: текущий код

from bs4 import BeautifulSoup as bs
from selenium import webdriver

driver = webdriver.Firefox(executable_path=r'c:\program files\firefox\geckodriver.exe')
driver.get("http://www.bom.gov.au/places/nsw/sydney/forecast/detailed/")

html = driver.page_source
soup = bs(html, "lxml")

dates = []

for tag in soup.find_all("a", {"class":"toggle"}):
    dates.append(tag.text)

temps = [item.text for item in soup.select('th.first:contains(Temperature) ~ td')]

print(dates)
print(temps)

Ответы [ 2 ]

0 голосов
/ 20 апреля 2019

Это легко с BS4 4.7.1.как вы можете использовать: содержит псевдокласс с ~ общим сестринским комбинатором

import requests
from bs4 import BeautifulSoup as bs

url = 'http://www.bom.gov.au/places/nsw/sydney/forecast/detailed'    
r = requests.get(url)
soup = bs(r.content, 'lxml')

for table in soup.select('[summary*=Temperatures]'):
    print(table['summary']) #day of reading
    tds = [item.text for item in table.select('.first:contains("Air temperature (°C)") ~ td')] #readings
    print(tds)

Вы можете получить часы показаний с помощью:

print([item.text.strip() for item in table.select('tr:nth-of-type(1) th')][1:-1])

Красиво отформатированныйтаблицы добавить в панды:

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

url = 'http://www.bom.gov.au/places/nsw/sydney/forecast/detailed'    
r = requests.get(url)
soup = bs(r.content, 'lxml')

for table in soup.select('[summary*=Temperatures]'):
    print(table['summary'])
    output = pd.read_html(str(table))[0]
    print(output)
0 голосов
/ 20 апреля 2019

Если я правильно понимаю, попробуйте это:

from bs4 import BeautifulSoup
import re

s = '''
    <tr>
        <th class="first">Temperature</th>
        <td>x</td>
        <td>x</td>
        <td>x</td>
        <td>x</td>
        <td>x</td>
        <td>x</td>
        <td>x</td>
        <td>x</td>
    </tr>

'''

soup = BeautifulSoup(s, "lxml")

[td.text for td in soup.find('th', string=re.compile("Temperature")).find_next_siblings()]

и вы получите:

['x', 'x', 'x', 'x', 'x', 'x', 'x', 'x']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...