Удаление тегов <wbr> и получение информации между

Я удаляю данные с веб-страницы и сделал это для определенного раздела, который имеет <br> тег.

<div class="scrollWrapper">
    <h3>Smiles</h3>
    CC=O<br>
    <button type="button" id="downloadSmiles">Download</button>
</div>

Я решил эту проблему, выполнив приведенный ниже скрипт для вывода CC=O,

from lxml import html

page = requests.get('http://chem.sis.nlm.nih.gov/chemidplus/name/'+ substance)
tree = html.fromstring(page.text)
if ("Smiles" in page.text):
        smiles = tree.xpath('normalize-space(//*[text()="Smiles"]/..//br[1]/preceding-sibling::text()[1])')
else:
        smiles = ""

Однако, просматривая другие страницы с различными химикатами, я обнаружил, что на них есть тег. Я понятия не имею, как избавиться от них, собирая информацию между ними. Ниже показан пример с моим желаемым выводом c1(c2ccccc2)ccc(N)cc1,

<div class="scrollWrapper">
   <h3>Smiles</h3>
   c1(c2ccccc2)<wbr>ccc(N)<wbr>cc1<br>
   <button type="button" id="downloadSmiles">Download</button>
</div>

3 ответа

Решение

Самое простое, что можно сделать, это заменить <wbr> строка в page.text с пустой строкой, прежде чем разбирать ее в html. Так как его внутри < а также > Я сомневаюсь, что какая-либо полезная информация, которую вы ищете, будет иметь ее.

Пример -

from lxml import html

page = requests.get('http://chem.sis.nlm.nih.gov/chemidplus/name/'+ substance)
tree = html.fromstring(page.text.replace('<wbr>',''))
if ("Smiles" in page.text):
        smiles = tree.xpath('normalize-space(//*[text()="Smiles"]/..//br[1]/preceding-sibling::text()[1])')
else:
        smiles = ""

В противном случае вы можете использовать решение @Bun по использованию BeautifulSoup или напишите сложные xpaths.

Кроме того, более простой xpath для вашего случая должен быть -

'normalize-space(//*[text()="Smiles"]/following-sibling::text()[1])'

Вместо того, чтобы узнать элемент Smiles, а затем взять его родителя, выясните первый br элемент, который является его потомком, затем берет своего предшествующего родного брата и затем его текст.

Вы должны непосредственно взять следующий брат за Smiles элемент, а затем его текст.

<wbr>

Тег (Word Break Opportunity) указывает, где в тексте было бы хорошо добавить разрыв строки. Совет. Если слово слишком длинное или вы боитесь, что браузер прервет ваши строки в неправильном месте, вы можете использовать этот элемент, чтобы добавить возможности разбиения слов.

я использую BeautifulSoup проанализировать эти данные.

from bs4 import BeautifulSoup as bs

html = """
<div class="scrollWrapper">
   <h3>Smiles</h3>
   c1(c2ccccc2)<wbr>ccc(N)<wbr>cc1<br>
   <button type="button" id="downloadSmiles">Download</button>
</div>
"""

soup = bs(html, "html.parser")
rows = soup.get_text().split()
print(rows[1])

Выход:

   c1(c2ccccc2)ccc(N)cc1

Просто чтобы указать: вы можете избавиться от конкретной строки, выполнив:

str.replace(old, "")

Так, например:

"c1(c2ccccc2)<wbr>ccc(N)<wbr>cc1<br>".replace("<wbr>", "").replace("<br>", "")

Однако другие ответы становятся ближе к желаемому результату.

Другие вопросы по тегам