Как сопоставить разные классы и атрибуты одновременно, используя find_all в красивом супе? - PullRequest
0 голосов
/ 05 марта 2020

Я хочу создать набор результатов элемента, который будет содержать все записи, соответствующие 2 условиям: их атрибут в одном классе будет «col1», а их атрибут в другом классе - «10.10». (Набор как пересечение двух наборов результатов)

В настоящее время я могу создать два отдельных набора результатов:

result1 = soup.find_all("textline", {"type" : "col1"}) #gives 600 results
result2 = soup.find_all("font", {"size" : "10.10"}) #gives 100 results

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

Я пытался поместить оба свойства в список, но он просто складывает результаты вместе

result = soup.find_all(["textline", {"type" : "col1"}, "font", { "size" : "10.10"}]) #gives 700 results

Я также пытался написать for-l oop, но он возвращает список та же длина, что и для result1 (но не для пересечения result1 и result2)

a= []
for i in soup.find_all("textline", {"type" : "col1"}):
    result = i.find_all("font", { "size" : "10.10"})
    a.append(result)

1 Ответ

0 голосов
/ 05 марта 2020

Я предпочитаю использовать .select().

from bs4 import BeautifulSoup
html = """<textline bbox="81.600,450.647,178.692,460.547" type="col1"><font face="Times-Italic" size="9.900">XeAchKit-Erlsiiirtntg. </font></textline> <textline bbox="57.800,410.347,151.488,420.391" type="col1"><font face="Times-Roman" size="10.10">1. Geographical entities </font></textline> """
soup = BeautifulSoup(html, 'lxml')
soup.select('textline[type="Col1"] font[size="10.10"]')

Вывод:

[<font face="Times-Roman" size="10.10">1. Geographical entities </font>]
...