0

我正在从网页中抓取数据,并且已针对具有该<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>
4

3 回答 3

2

最简单的做法是在将其解析为 html 之前将<wbr>字符串替换为空字符串。page.text由于它在内部<>我怀疑您正在寻找的任何有用信息是否会包含它。

例子 -

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 = ""

否则,您可以使用BeautifulSoup@Bun 的 using 解决方案,或者编写复杂的 xpath。

此外,对于您的情况,更简单的 xpath 应该是 -

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

不是找出 Smiles 元素,然后取其父元素,然后找出第一个 br是其后代的元素,然后取其前一个兄弟元素,然后是其文本。

您应该直接将以下兄弟元素作为Smiles元素,然后是其文本。

于 2015-07-07T18:19:28.803 回答
1

<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
于 2015-07-07T18:17:31.613 回答
0

只是要指出:您可以通过执行以下操作摆脱特定字符串:

str.replace(old, "")

例如:

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

但是,其他答案更接近预期的结果。

于 2015-07-07T18:18:54.833 回答