Как получить доступ к следующему элементу ниже в файле HTML с помощью красивого супа - PullRequest
0 голосов
/ 19 июня 2020
<ns1:AffectedAreas>
      <ns1:Area>
        <ns1:AreaId>10YDK-1--------W</ns1:AreaId>
        <ns1:AreaName>DK1</ns1:AreaName>
      </ns1:Area>
</ns1:AffectedAreas>

Я изо всех сил старался получить доступ к ns1:AreaId, который от (10YDK-1--------W) до ns1:AffectedAreas, используя B = soup.find('ns1:area'), а затем B.next_element, но все, что я получаю, это пустая строка .

enter image description here

Ответы [ 4 ]

0 голосов
/ 21 июня 2020

Другой метод.

from simplified_scrapy import SimplifiedDoc, req, utils
html = '''
<ns1:AffectedAreas>
      <ns1:Area>
        <ns1:AreaId>10YDK-1--------W</ns1:AreaId>
        <ns1:AreaName>DK1</ns1:AreaName>
      </ns1:Area>
      <ns1:Area>
        <ns1:AreaId>10YDK-2--------W</ns1:AreaId>
        <ns1:AreaName>DK2</ns1:AreaName>
      </ns1:Area>
</ns1:AffectedAreas>
'''
doc = SimplifiedDoc(html)
AffectedArea = doc.select('ns1:AffectedAreas')
Areas =  AffectedArea.selects('ns1:Area')
AreaIds = Areas.select('ns1:AreaId').html
print (AreaIds)
# or
# print (doc.select('ns1:AffectedAreas').selects('ns1:Area').select('ns1:AreaId').html)

Результат:

['10YDK-1--------W', '10YDK-2--------W']

Вот еще примеры: https://github.com/yiyedata/simplified-scrapy-demo/tree/master/doc_examples

0 голосов
/ 19 июня 2020

Попробуйте этот метод,

import bs4
import re

data = """
<ns1:AffectedAreas>
      <ns1:Area>
        <ns1:AreaId>10YDK-1--------W</ns1:AreaId>
        <ns1:AreaName>DK1</ns1:AreaName>
      </ns1:Area>
</ns1:AffectedAreas>
"""
def striphtml(data):
    p = re.compile(r'<.*?>')
    return p.sub('', data)

bs = bs4.BeautifulSoup(data, "html.parser")
areaid = bs.find_all('ns1:areaid')
print((striphtml(str(areaid))))

Здесь функция striphtml удалит все теги, содержащие <>. Таким образом, на выходе будет

[10YDK-1--------W]
0 голосов
/ 19 июня 2020

Если вы определили пространства имен в своем документе HTML / XML, вы можете использовать парсер xml и селекторы CSS.

Например:

txt = '''<root xmlns:ns1="some namespace">
    <ns1:AffectedAreas>
      <ns1:Area>
        <ns1:AreaId>10YDK-1--------W</ns1:AreaId>
        <ns1:AreaName>DK1</ns1:AreaName>
      </ns1:Area>
</ns1:AffectedAreas>
</root>'''

soup = BeautifulSoup(txt, 'xml')

area_id = soup.select_one('ns1|AffectedAreas ns1|AreaId').text
print(area_id)

Печать:

10YDK-1--------W
0 голосов
/ 19 июня 2020

Вы можете попробовать перебрать дочерние элементы soup.find('ns1:area'), чтобы найти тег ns1:areaid, а затем получить его текст.

for i in soup.find('ns1:area').children:
    if i.name == "ns1:areaid":
        b = i.text
print(b)

А из ns1:AffectedAreas это будет выглядеть как

for i in soup.find_all('ns1:AffectedAreas'.lower()):
    for child in i.children:
        if child.name == "ns1:area":
            for y in child.children:
                if y.name == "ns1:areaid":
                    print(y.text)

Или найти тег ns1:AreaId в нижнем регистре и получить его текст. таким образом вы можете получить все текстовые значения из всех тегов ns1:AreaId.

soup.find_all("ns1:AreaId".lower())[0].text

В обоих случаях будет выведено

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