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

それ以外の場合は、@Bun の を使用するソリューションを使用BeautifulSoupするか、複雑な 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 に答える