【问题标题】:How to concatenate strings within a br in python XPath?python - 如何在python XPath中连接br内的字符串?
【发布时间】:2015-11-20 11:28:57
【问题描述】:

试图解决如何在 <br> 中连接字符串的方法不起作用。

代码如下:

<li class="attr">
    <span>
        Size:L
        <br>
        Color:RED
    </span>
</li>

我尝试使用这些但不起作用:

color_and_size = row.xpath('.//li[@class="attr"][1]/span[1]/text()')[0]

【问题讨论】:

  • &lt;br&gt; 内是什么意思?你能给出你想要的输出样本吗?
  • 我想打印“Size:L”和“Color:RED”
  • 这是无效的XML,因为您的&lt;BR&gt; 标签未关闭。因此,您将无法对它使用 xpath 表达式。
  • “不工作”是对该输入的低估。这可能会结束嘈杂,还是您使用try-except 子句?
  • 您不应该真正将 xpath 用于 HTML 文档,请尝试使用 BeautifulSoup。

标签: python xpath lxml


【解决方案1】:

您的 xml 结构似乎已损坏,因为没有关闭 &lt;/br&gt; 标记-因此,如果您使用 lxml,请尝试使用 Beautifulsoup 的 soupparser-或者您可以使用独立的 Beutifulsoup,如下所示-

from bs4 import BeautifulSoup
s = """<li class="attr">
    <span>
        Size:L
        <br>
        Color:RED
    </span>
</li>
"""
soup = BeautifulSoup(s)

print map(lambda x: x.text.strip().replace("\n",""),soup.find_all('span'))

打印-

[u'Size:L                Color:RED']

注意Beautifulsoup 在内部组织 xml,例如如果您想要格式错误的 xml 的有效 xml,请尝试-

print soup.prettify()

打印-

<html>
 <body>
  <li class="attr">
   <span>
    Size:L
    <br/>
    Color:RED
   </span>
  </li>
 </body>
</html>

如果您的xml 有效,则下面的xpath 将起作用-

//li[@class='attr']/span/text()[preceding-sibling::br or following-sibling::br]

Live Demo 只需点击 Test 按钮

【讨论】:

    【解决方案2】:

    您可以将 Python 字符串方法与lxml 的 XPath 返回值结合起来:

    >>> import lxml.html
    >>> text = '''<html>
    ... <li class="attr">
    ...     <span>
    ...         Size:L
    ...         <br>
    ...         Color:RED
    ...     </span>
    ... </li>
    ... </html>'''
    >>> doc = lxml.html.fromstring(text)
    >>>
    >>> # text nodes can contain leading and trailing whitespace characters
    >>> doc.xpath('.//li[@class="attr"]/span[1]/text()')
    ['\n        Size:L\n        ', '\n        Color:RED\n    ']
    >>> 
    >>> # you can use Python's strip() method
    >>> [t.strip() for t in doc.xpath('.//li[@class="attr"]/span[1]/text()')]
    ['Size:L', 'Color:RED']
    

    如果&lt;span&gt; 包含&lt;br&gt;,您也可以测试它:(span[br] 而不是span[1])

    >>> doc.xpath('.//li[@class="attr"]/span[br]/text()')
    ['\n        Size:L\n        ', '\n        Color:RED\n    ']
    >>> [t.strip() for t in doc.xpath('.//li[@class="attr"]/span[br]/text()')]
    ['Size:L', 'Color:RED']
    >>> 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-15
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多