【问题标题】:Unable to get the full content using selector无法使用选择器获取完整内容
【发布时间】:2018-02-12 04:16:53
【问题描述】:

我已经编写了一些在 python 中使用的选择器来获取一些项目和它的价值。我希望刮掉不做样式的物品。但是,当我运行我的脚本时,它只获取项目但无法达到由“br”标签分隔的那些项目的值。我怎样才能抓住它们?在这种情况下,我不打算使用 xpath 来达到目的。提前致谢。

这里是元素:

html = '''
<div class="elems"><br>
    <ul>
    <li><b>Item Name:</b><br>
            titan
                </li>
        <li><b>Item No:</b><br>
                23003400
                    </li>
        <li><b>Item Sl:</b><br>
            2760400
                </li>
        </ul>
    </div>
'''

这是我的脚本,其中包含 css 选择器:

from lxml import html as e

root = e.fromstring(html)
for items in root.cssselect(".elems li"):
    item = items.cssselect("b")[0].text_content()
    print(item)

执行后,我得到的结果:

Item Name:
Item No:
Item Sl:

我追求的结果:

Item Name: titan
Item No: 23003400
Item Sl: 2760400

【问题讨论】:

  • 我会说这是Get all text inside a tag in lxml的副本。
  • 我按照这两个链接查看我的问题是否真的重复或相同。答案很明确:没有。在这两个链接中,我看不到“css-selectors”标签。此外,我坚持只根据选择器来回答。那么,怎么可能重复呢?
  • @Topto, .cssselect 只不过是 .xpath 方法的包装。看这里github.com/scrapy/cssselect:“cssselect 解析 CSS3 选择器并将它们转换为 XPath 1.0 表达式”。因此,在这里使用 XPath 或 CSS 选择器实际上没有区别。
  • @skovorodkin,是的,没错。但是,我的意图是使用 css 选择器完成任务,这就是我试图在答案中展示的内容。谢谢。

标签: python python-3.x web-scraping css-selectors lxml


【解决方案1】:

有史以来最简单的解决方案。值在“li”标签而不是“b”内。

from lxml import html as e

root = e.fromstring(html)
for items in root.cssselect(".elems"):
    item = [item.text_content() for item in items.cssselect("li")]
    print(''.join(item))

【讨论】:

    【解决方案2】:

    一般我使用.itertext方法提取文本:

    from lxml.html import fromstring
    
    def extract_text(el, sep=' '):
        return sep.join(s.strip() for s in li.itertext() if s.strip())
    
    tree = fromstring(html)
    for li in tree.cssselect('.elems li'):
        print(extract_text(li))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-22
      • 2023-03-27
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2020-07-25
      • 2023-03-06
      相关资源
      最近更新 更多