Использование next_sibling с цветом шрифта в BS4 - PullRequest
0 голосов
/ 06 июля 2019

Мне нужно получить данные после определенной ссылки с текстовой картой, но она не работает, когда данные после ссылки окрашены. Как мне это получить?

В настоящее время я использую next_sibling, но он получает только те точки данных, которые не выделены красным.

HTML-код такой. Я могу прочитать число отсюда


    <a href="http://scedc.caltech.edu/recent/Maps/118-36.html" class="link2">map</a>
    " 2.8 "

но не отсюда


    <a href="http://scedc.caltech.edu/recent/Maps/118-36.html" class="link2">map</a>
    <font color="red">3.1</font>


    soup=BeautifulSoup(page.content, 'html.parser')
    tags = soup.find_all("a",{'class': 'link2'})
    output=open("file.txt","w")

    for i in tags:

        if i.get_text()=="map":
            # prints each next_sibling
            print(i.next_sibling)
            # Extracts text if needed.
            try:
                output.write(i.next_sibling.get_text().strip()+"\n")
            except AttributeError:
                output.write(i.next_sibling.strip()+"\n")
    output.close()

Программа записывает все цифры, которые не выделены красным, и оставляет пустые места, где присутствуют красные цифры. Я хочу, чтобы это показало все.

Ответы [ 2 ]

0 голосов
/ 06 июля 2019

Зависит от того, как ваш HTML в целом.Это имя класса всегда связано с тегом a, например?Вы могли бы сделать следующее.Требуется BS4 4.7.1.

import requests

from bs4 import BeautifulSoup as bs

html = '''

<a href="http://scedc.caltech.edu/recent/Maps/118-36.html" class="link2">map</a>
    " 2.8 "
<a href="http://scedc.caltech.edu/recent/Maps/118-36.html" class="link2">map</a>
<font color="red">3.1</font>

'''
soup = bs(html, 'lxml')
data = [item.next_sibling.strip() if item.name == 'a' else item.text.strip()  for item in soup.select('.link2:not(:has(+font)), .link2 + font')]
print(data)
0 голосов
/ 06 июля 2019

Если мы сможем увидеть больше вашего HTML-дерева, возможно, есть лучший способ сделать это, но с учетом небольшого количества html, которое вы нам показали, вот один способ, который, вероятно, будет работать.

from bs4 import BeautifulSoup

html = """<a href="http://scedc.caltech.edu/recent/Maps/118-36.html" class="link2">map</a>2.8
    <a href="http://scedc.caltech.edu/recent/Maps/118-37.html" class="link2">map</a>
    <font color="red">3.1</font>"""

soup=BeautifulSoup(html, 'html.parser')
tags = soup.find_all("a",{'class': 'link2'})
output=open("file.txt","w")

for i in tags:
    if i.get_text()=="map":
        siblings = [sib for sib in i.next_siblings]
        map_sibling_text = siblings[0].strip()
        if map_sibling_text == '' and len(siblings) > 1:
            if siblings[1].name == 'font':
                map_sibling_text = siblings[1].get_text().strip()
        output.write("{0}\n".format(map_sibling_text))

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