Удаление тегов <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>", "")
Однако другие ответы становятся ближе к желаемому результату.