Разобрать DOM как Javascript, используя BeautifulSoup - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть образец HTML в переменной html_doc, например:

html_doc =  """<table class="sample">
        <tbody>
        <tr class="title"><td colspan="2">Info</td></tr>
        <tr>
        <td class="light">Time</td>
        <td>01/01/1970, 00:00:00</td>
        </tr>
        <td class="highlight">URL</td>
        <td>https://test.com</td>
        </tr>
        </tbody>
        </table>"""

Использование Javascript довольно просто, если я хочу проанализировать DOM.Но если я хочу получить ТОЛЬКО URL (https://test.com) и Time (01/01/1970, 00:00:00) в 2 разных переменных из тега <td> выше, как я могу это сделать, если с ним не связано имя класса.

Mytest.py файл

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc,'html.parser')
test = soup.find_all("td")
print(test)

Ответы [ 4 ]

0 голосов
/ 12 сентября 2018

со ссылкой @ DeepSpace

import bs4, re
from bs4 import BeautifulSoup

html_doc =  """<table class="sample">
        <tbody>
        <tr class="title"><td colspan="2">Info</td></tr>
        <tr>
        <td class="light">Time</td>
        <td>01/01/1970, 00:00:00</td>
        </tr>
        <td class="highlight">URL</td>
        <td>https://test.com</td>
        </tr>
        </tbody>
        </table>"""

datepattern = re.compile("\d{2}/\d{2}/\d{4}, \d{2}:\d{2}:\d{2}")
soup = BeautifulSoup(html_doc,'html.parser')
for td in soup.find_all('td'):
    if td.text.startswith('http'):
        link = td.text
    elif datepattern.search(td.text):
        time = td.text
print(link, time)
0 голосов
/ 12 сентября 2018

Вы можете попробовать использовать регулярное выражение, чтобы получить URL

from bs4 import BeautifulSoup
import re
soup = BeautifulSoup(html_doc,'html.parser')
test = soup.find_all("td")
for tag in test:
    urls = re.match('https?://(?:[-\w.]|(?:%[\da-fA-F]{2}))+', tag.text)
    time = re.match('[0-9/:, ]+',tag.text)
    if urls!= None:
        print(urls.group(0))
    if time!= None:
        print(time.group(0))

выход

01/01/1970, 00: 00: 00
https://test.com

0 голосов
/ 12 сентября 2018

Это очень специфическое решение.Если вам нужен общий подход, решение Хари Кришнана с несколькими настройками может быть более подходящим.

from bs4 import BeautifulSoup
soup = BeautifulSoup(html_doc,'html.parser')
tds = []

for td in soup.find_all('td', {'class': ['highlight', 'light']}):
    tds.append(td.find_next_sibling().string)

time, link = tds
0 голосов
/ 12 сентября 2018

У вас уже есть все td элементов.Вы можете перебрать все из них:

for td in soup.find_all('td'):
    if td.text.startswith('http'):
        print(td, td.text)
# <td>https://test.com</td> https://test.com

Если хотите, вы можете быть немного менее явным, если поискать элемент td с классом «highlight» и найти следующего брата, но этобольше ошибок подвержено изменению DOM:

for td in soup.find_all('td', {'class': 'highlight'}):
   print(td.find_next_sibling())
# <td>https://test.com</td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...