我正在从网页中删除数据,并且已针对具有<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>
答案 0 :(得分: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
的解决方案,或编写复杂的xpath。
此外,您的案例的简单xpath应该是 -
'normalize-space(//*[text()="Smiles"]/following-sibling::text()[1])'
而不是找出Smiles,元素然后取其父元素,然后找出第一个br
元素,即它的后代,然后是它的前一个兄弟,然后是它的文本。
您应该直接为Smiles
元素及其文本提供以下兄弟。
答案 1 :(得分:2)
<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
答案 2 :(得分:0)
要指出:您可以通过执行以下操作来删除特定字符串:
str.replace(old, "")
例如:
"c1(c2ccccc2)<wbr>ccc(N)<wbr>cc1<br>".replace("<wbr>", "").replace("<br>", "")
但是,其他答案更接近理想的结果。