Beautifulsoup - извлекает текст из следующего тега div на основе предыдущего тега div - PullRequest
0 голосов
/ 21 сентября 2018

Я пытаюсь извлечь данные из следующего диапазона div на основе предыдущего текста div-span. Ниже приведено содержание html,

<div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:37px; top:161px; width:38px; height:13px;"><span style="font-family: b'Times-Bold'; font-size:13px">Name
<br></span></div><div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:85px; top:161px; width:58px; height:13px;"><span style="font-family: b'Helvetica'; font-size:13px">Ven
    <br></span></div>

Я пытаюсь найти текст, используя,

n_field = soup.find('span', text="Name\")

И затем пытаюсь получить текст от следующего брата, используя,

n_field.next_sibling()

Однако из-за "\ n" в поле я не могу найти диапазон и извлечь текст next_sibling.

Короче говоря, я пытаюсь сформировать подсказку в приведенном нижеформат,

{"Name": "Ven"}

Любая помощь или идея по этому вопросу приветствуется.

Ответы [ 3 ]

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

Вы можете использовать re вместо bs4.

import re

html = """
    <div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:37px; top:161px; width:38px; height:13px;">
        <span style="font-family: b'Times-Bold'; font-size:13px">Name
            <br>
        </span>
    </div>
    <div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:85px; top:161px; width:58px; height:13px;">
        <span style="font-family: b'Helvetica'; font-size:13px">Ven
            <br>
        </span>
    """

mo = re.search(r'(Name).*?<span.*?13px">(.*?)\n', html, re.DOTALL)
print(mo.groups())

# for consecutive cases use re.finditer or re.findall
html *= 5
mo = re.finditer(r'(Name).*?<span.*?13px">(.*?)\n', html, re.DOTALL)

for match in mo:
    print(match.groups())

for (key, value) in re.findall(r'(Name).*?<span.*?13px">(.*?)\n', html, re.DOTALL):
    print(key, value)
0 голосов
/ 21 сентября 2018

Я попробовал это сделать, и по какой-то причине даже после удаления \ n я не смог получить nextSibling (), поэтому я попробовал другую тактику, как показано ниже:

from bs4 import BeautifulSoup

"""Lets get rid of the \n""" 
html = """<div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:37px; top:161px; width:38px; height:13px;"><span style="font-family: b'Times-Bold'; font-size:13px">Name<br></span></div><div style="position:absolute; border: textbox 1px solid; writing-mode:lr-tb; left:85px; top:161px; width:58px; height:13px;"><span style="font-family: b'Helvetica'; font-size:13px">Ven<br></span></div>""".replace("\n","")
soup = BeautifulSoup(html)
span_list = soup.findAll("span")
result = {span_list[0].text:span_list[1].text.replace(" ","")}

И этодает результат в виде:

{'Name': 'Ven'}

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

Я бы написал это, чтобы получить эти элементы:

soup.find('span', attrs={'style': "font-family: b'Times-Bold'; font-size:13px"}).text

soup.find('span', attrs={'style': "font-family: b'Helvetica'; font-size:13px"}).text

...