Очистка таблицы с теми же атрибутами класса - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь почистить время молитвы с веб-сайта www.hujjat.org.

Вот html-часть интересующей меня области (как вы могли заметить, атрибут класса одинаков для всех 4 молитв):

<table width="100%">
    <tbody>
        <tr>
            <td class="NamaazTimes">
                <div class="NamaazTimeName">Fajr</div>
                <div class="NamaazTime">04:42</div>
            </td>
            <td class="NamaazTimes">
                <div class="NamaazTimeName">Sunrise</div>
                <div class="NamaazTime">06:32</div>
            </td>
            <td class="NamaazTimes">
                <div class="NamaazTimeName">Zohr</div>
                <div class="NamaazTime">13:02</div>
            </td>
            <td class="NamaazTimes">
                <div class="NamaazTimeName">Maghrib</div>
                <div class="NamaazTime">19:33</div>
            </td>
        </tr>
    </tbody>
</table>

Пока у меня естьнаписал следующий код:

# import libraries
import json
import urllib2
from bs4 import BeautifulSoup
# specify the url
quote_page = 'http://www.hujjat.org/'
# query the website and return the html to the variable 'page'
page = urllib2.urlopen(quote_page)
# parse the html using beautiful soap and store in variable 'soup'
soup = BeautifulSoup(page, 'html.parser')

table = soup.find("div",class_="NamaazTimeName", text="Fajr").find_previous("table")
for row in table.find_all("tr"):
    a = row.find_all("td")

   # print(row.find_all("td"))

print (a)

И мой результат:

[<td class="NamaazTimes">\n<div class="NamaazTimeName">Fajr</div>\n<div class="NamaazTime">04:42</div>\n</td>, <td class="NamaazTimes">\n<div class="NamaazTimeName">Sunrise</div>\n<div class="NamaazTime">06:32</div>\n</td>, <td class="NamaazTimes">\n<div class="NamaazTimeName">Zohr</div>\n<div class="NamaazTime">13:02</div>\n</td>, <td class="NamaazTimes">\n<div class="NamaazTimeName">Maghrib</div>\n<div class="NamaazTime">19:33</div>\n</td>]

То, что я хочу из своего кода, это просто время для каждой молитвы, например, если это «Фаджр»тогда молитва должна быть «04:42».Затем я хочу сохранить это "04:42" в текстовом файле.

Может кто-нибудь помочь мне, пожалуйста?

Спасибо.

Ответы [ 3 ]

0 голосов
/ 12 сентября 2018
    from bs4 import BeautifulSoup
    import pandas as pd

    data = BeautifulSoup(#HTML data)

    NamaazName = data.find_all('div', {'class':'NamaazTimeName'})
    NamaazTime = data.find_all('div', {'class':'NamaazTime'})

    for i in range(len(NamaazName)):
        coll[NamaazName[i].text] = NamaazTime[i].text

    master_data.columns=pd.DataFrame()

    master_data['NamaazName'] = coll.keys()
    master_data['NamaazTime'] = coll.values()

   print(master_data)

выход

    Nammaz  NammazTime
0    Fajr     04:42 
1    Sunrise  06:32 
2    Zohr     13:02 
3    Maghrib  19:33 
0 голосов
/ 13 сентября 2018

Это работает:

from bs4 import BeautifulSoup
import requests

url = 'https://www.hujjat.org/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')
path = 'C:/Users/John/Documents/Python/'

namaazNames = soup.select('div.NamaazTimeName')
namaazNames = [namaazName.text for namaazName in namaazNames]
namaazTimes = soup.select('div.NamaazTime')
namaazTimes = [namaazTime.text for namaazTime in namaazTimes]
del namaazNames[1]
del namaazTimes[1]

for namaazName, namaazTime in zip(namaazNames, namaazTimes):
    with open(path + namaazName + '.txt', 'w') as file:
        file.write(namaazTime)
0 голосов
/ 12 сентября 2018

Я бы посоветовал вам использовать select вместо find, чтобы сделать запрос более похожим на селекторы css браузера. Таким образом, вы можете просто собрать все внутренние тексты в одном списке и работать оттуда.

Что-то похожее на это должно помочь:

# import libraries
import json
import urllib2
from bs4 import BeautifulSoup
# specify the url
quote_page = 'http://www.hujjat.org/'
# query the website and return the html to the variable 'page'
page = urllib2.urlopen(quote_page)
# parse the html using beautiful soap and store in variable 'soup'
soup = BeautifulSoup(page, 'html.parser')

table = soup.find("div",class_="NamaazTimeName", text="Fajr").find_previous("table")
texts = [x.text for x in table.select("td.NamaazTimes div")]
only_times = [texts[x+1] for x in range(0, len(texts), 2)]

# we'll open the file in a with block, so we don't need to close it
with open("foo.txt", "w") as fp:
    # you'll need to iterate each string
    for row in only_times:
        fp.write(row + "\n")

EDIT (2): перефразировал мои комментарии в коде РЕДАКТИРОВАТЬ (3): Сделал некоторую очистку sode и изменил, чтобы сохранить только время.

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