Строковый аргумент ведет себя по-разному в моем скрипте - PullRequest
0 голосов
/ 22 января 2019

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

Как в этом случае использовать строковый аргумент для извлечения текста?

Я пытался:

import re
from bs4 import BeautifulSoup

htmlelement = """
<caption>
    <span class="toggle open"></span>
    ASIC registration
</caption>
"""
soup = BeautifulSoup(htmlelement,"lxml")
try:
    item = soup.find("caption",string="ASIC registration").text
    #item = soup.find("caption",string=re.compile("ASIC registration",re.I)).text
except AttributeError:
    item = ""
print(item)

Ожидаемый результат (only using string argument):

ASIC registration

Ответы [ 3 ]

0 голосов
/ 22 января 2019

Оказывается, что строковый параметр не работает, если у тега есть дочерний тег.Следующий код глуп, но работает:

real_item = ""
try:
    items = soup.find_all("caption")
    r = re.compile(u"ASIC registration", re.I)
    for item in items:
        for s in item.strings:
            if r.search(unicode(s)):
                real_item = item
                break

except AttributeError:
    real_item = ""
print(real_item)
0 голосов
/ 22 января 2019

Как в этом случае использовать строковый аргумент для извлечения текста?

Вы не можете

Примечание: Я предполагаю, что вы подразумеваете под некоторым изменением строкового параметра в

item = soup.find("caption",string="ASIC registration").text

Как указано в документации

Если у тега есть только один дочерний элемент, и этот дочерний элемент является NavigableString, ребенок доступен как .string:

import re
from bs4 import BeautifulSoup
htmlelement = """
<caption>
    <span class="toggle open"></span>
    ASIC registration
</caption>
"""
soup = BeautifulSoup(htmlelement,"lxml")
item = soup.find("caption")
print(item.string)

выход

None

Здесь .string равно None, поскольку заголовок имеет более одного ребенка.

Если вы пытаетесь получить родительский элемент (в данном случае тег заголовка) с текстом, вы можете сделать

item = soup.find(string=re.compile('ASIC registration')).parent

что даст

<caption><a></a>ASIC registration</caption>

Конечно, вызов .text для этого родительского тега даст полный текст внутри этого тега, если это не полный текст внутри него.

item = soup.find(string=re.compile('ASIC')).parent.text

выдаст вывод

ASIC registration
0 голосов
/ 22 января 2019

Проблема, с которой вы сталкиваетесь, заключается в том, что строковый аргумент ищет строки вместо тегов, как это указано в документации, которую вы связали.

Синтаксис, который вы используете:

soup.find("caption",string="ASIC registration")

предназначен для поиска тегов.

Для поиска строк:

soup.find(string=re.compile('ASIC'))

С первым выговорят, найти тег заголовка с атрибутом "строка" вашей строки.Тег caption не имеет строкового атрибута, поэтому ничего не возвращается.

Второй говорит, что найдите строку, содержащую 'ASIC', поэтому он возвращает строку.

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