删除<wbr />标签并抓取之间的信息

时间:2015-07-07 18:10:27

标签: python lxml 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 个答案:

答案 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>", "")

但是,其他答案更接近理想的结果。