Beautifulsoup простой способ найти теги прямо под другими тегами - PullRequest
0 голосов
/ 18 марта 2020

В красивом супе я знаю, что вы можете легко найти теги под другими тегами, используя селекторы CSS, т.е. если у меня есть следующий манекен xml:

<a>

  <b>
    <c>textabc1</c>
  </b>

  <b>
    <c>textabc2</c>
  </b>

  <c>
    <c>textacc</c>
  </c>

</a>

после создания супа, предположим, что я Я хотел бы найти все теги c ниже b под a (a-> b -> c). Я бы просто запустил следующую команду:

soup.select('a > b > c')

, которая возвращает меня:

[<c>textabc1</c>, <c>textabc2</c>]

Есть ли простой способ сделать это без использования селекторов CSS?

Я провожу день, пытаясь найти простой способ сделать это с помощью «более стандартных» методов красивого супа. В приведенном мною примере есть 3 уровня отступа тега, но очень важно отметить, что я не смогу знать ни xml, ни теги, ни уровень их отступа до времени выполнения (все будет передано в качестве параметров в скрипт ), поэтому мне может понадобиться найти теги от 1 до n уровней отступа (если бы я заранее знал, что мне нужно искать не более 3 уровней отступа, я мог бы, вероятно, использовать 3 цикла с отступом и комбинацию методов findAll / findChildren Я думал о каком-то рекурсивном методе, но логика c кажется сложной.

Заранее спасибо.

Ответы [ 2 ]

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

Я не знаю, есть ли что-нибудь, что вы хотите.

from simplified_scrapy import SimplifiedDoc,req,utils
html='''
<a>
  <b>
    <c>textabc1</c>
  </b>
  <b>
    <c>textabc2</c>
  </b>
  <c>
    <c>textacc</c>
  </c>
</a>
'''
doc  = SimplifiedDoc(html)
cs = doc.selects('a>a|b').c
print (cs)
cs = doc.a.getElements(['a','b']).getElement('c')
print (cs)
cs = doc.selects('a>a|b|c').c
print (cs)

Результат:

[{'tag': 'c', 'html': 'textabc1'}, {'tag': 'c', 'html': 'textabc2'}]
[{'tag': 'c', 'html': 'textabc1'}, {'tag': 'c', 'html': 'textabc2'}]
[{'tag': 'c', 'html': 'textabc1'}, {'tag': 'c', 'html': 'textabc2'}, {'tag': 'c', 'html': 'textacc'}]
0 голосов
/ 19 марта 2020

Если все, что вы хотите, это все вхождения тега. затем попробуйте следующее.

all_c_elements = soup.find_all("c")

Это вернет все элементы на странице, независимо от того, насколько они внизу древовидной структуры.

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