python - 获取 lxml/Python 中选定元素旁边的文本

标签 python html lxml elementtree

我有以下 HTML 标记,我想从此片段中获取纯文本形式的英文描述 - 没有“英文,并且没有任何标签”:

from lxml import etree


html = '''
    <td class="description">
    <p><b>English:</b> Ulm, Germany, old town with Münster, city wall and Metzgerturm, as seen from the south bank of the river Danube.</p>
    <p><b>Deutsch:</b> Ulm, Ansicht der Altstadt vom rechten Donauufer aus. Abgebildet ist das Donauschwabenufer, von der Altstadt sind erkennbar: Das dominante Münster mit Hauptturm, Schiff und zwei Chortürmen; unterhalb des Hauptturms des Münsters zwei Giebel, die zur historischen Krone gehören (linker Giebel größtenteils von Bäumen verdeckt); die Spitze der neuen, gläsernen Stadtbibliothek von Gottfried Böhm; weiter rechts zwei Giebel des Rathauses (gelb-braun); am rechten Rand der Metzgerturm als Teil der Stadtbefestigung.</p>
    </td>
'''

tree = etree.fromstring(html)
for el in tree.xpath('//td[contains(concat(" ", normalize-space(@class), " "), " description ")]/div|p'):
    print etree.tostring(el)

通过这个脚本,我得到了包括所有标签的单个段落,但我被困在那里......这些段落也可能是 DIV;因此我在 xpath 中使用了 div|p。

lxml 解决方案还应该与 DIV 容器一起使用,如下所示:

<td class="description">
    <div class="description mw-content-ltr et" dir="ltr" lang="et" style=""><span class="language et" title=""><b>Eesti:</b></span> Olen loonud selle pildi, kui ma nägin arutelu uue Wiki logo.</div>
    <div class="description mw-content-ltr en" dir="ltr" lang="en" style=""><span class="language en" title=""><b>English:</b></span> "Prototype" for new Wiktionary Logo</div>
</td>

最佳答案

要获取的文本是b标签的尾部:

import lxml.html

html = u'''
    <td class="description">
    <p><b>English:</b> Ulm, Germany, old town with Münster, city wall and Metzgerturm, as seen from the south bank of the river Danube.</p>
    <p><b>Deutsch:</b> Ulm, Ansicht der Altstadt vom rechten Donauufer aus. Abgebildet ist das Donauschwabenufer, von der Altstadt sind erkennbar: Das dominante Münster mit Hauptturm, Schiff und zwei Chortürmen; unterhalb des Hauptturms des Münsters zwei Giebel, die zur historischen Krone gehören (linker Giebel größtenteils von Bäumen verdeckt); die Spitze der neuen, gläsernen Stadtbibliothek von Gottfried Böhm; weiter rechts zwei Giebel des Rathauses (gelb-braun); am rechten Rand der Metzgerturm als Teil der Stadtbefestigung.</p>
    </td>
    <td class="description">
        <div class="description mw-content-ltr et" dir="ltr" lang="et" style=""><span class="language et" title=""><b>Eesti:</b></span> Olen loonud selle pildi, kui ma nägin arutelu uue Wiki logo.</div>
        <div class="description mw-content-ltr en" dir="ltr" lang="en" style=""><span class="language en" title=""><b>English:</b></span> "Prototype" for new Wiktionary Logo</div>
    </td>
'''

tree = lxml.html.fromstring(html)
for el in tree.cssselect('td.description p b, td.description span'):
    if el.text_content().startswith('English'):
        print(el.tail.strip())

输出:

Ulm, Germany, old town with Münster, city wall and Metzgerturm, as seen from the south bank of the river Danube.
"Prototype" for new Wiktionary Logo

注意您需要使用lxml.html。否则,您无法使用 text_content() 方法。

关于python - 获取 lxml/Python 中选定元素旁边的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26179832/

相关文章:

python - Pandas :意外的加入行为导致 NaN

python - 在Python中使用XPath提取属性值

javascript - 如何替换html中的doctype?

javascript - 如何在我的代码中将文本放在移动菜单的标题栏中?

Python lxml(对象化): Xpath troubles

python - "lxml.etree.XPathEvalError: Invalid expression"带有 Unicode 元素名称

python - itertools.combinations 如何在 Python 中扩展?

python - 如何使仿射变换矩阵成为透视变换矩阵?

python - 使用 Python 将字符串转换为格式化的日期时间字符串

html - 我怎样才能在我的 <nav> 的 100% 中公平地分配我的 Bootstrap 菜单?