【问题标题】:How can I get to some specific text using selector?如何使用选择器获取某些特定文本?
【发布时间】:2018-01-05 16:48:00
【问题描述】:

如何结合使用 python 和 css 选择器访问“电话”和“传真”。我确实选择了“姓名”,但如果是“电话”和“传真”,我就卡住了。对此的任何帮助将不胜感激。提前致谢。

我试过了:

name = div.contact-details p     #It works
phone = div.contact-details p    #Can't think beyond
fax = div.contact-details p      #Can't think beyond

项目所在的元素:

<div class="contact-details block dark">
<h3>Contact Details</h3><p>Company Name: PIMS Group Pty Ltd<br>Phone: +61 7 
4969 3900<br>Fax: +61 7 4969 3999<br>Email: <a 
href="mailto:admin@pims.net.au">admin@pims.net.au</a><br>Web: <a 
target="_blank" href="http://www.pims.net.au">http://www.pims.net.au</a></p>
<h4>Address</h4><p>43 Evans Avenue<br>North Mackay<br>QLD<br>4740</p>
<h4>Contact</h4><p></p>
</div>

【问题讨论】:

  • 您的全部数据都在p 标记中,由&lt;br&gt; 分隔。您可以获取p 标记的内容并使用正则表达式对其进行解析以获取特定信息

标签: python web-scraping css-selectors lxml


【解决方案1】:

您可以尝试使用下面的XPath 表达式来获取所需的数据:

# For Fax
substring-after(//div[@class="contact-details block dark"]/p/text()[starts-with(., "Fax:")], "Fax: ")
# For Phone
substring-after(//div[@class="contact-details block dark"]/p/text()[starts-with(., "Phone:")], "Phone: ")

【讨论】:

  • 感谢安德森爵士的回答。您的解决方案永远不会失败。但是,由于我的无能,我无法使其工作。如果我做得对,那么你的意思是作为一个整体: xpath('//div[@class="contact-details block dark"]//p/text()[starts-with(., "Fax:")] , "Phone: ")[0] . 表达式中的右括号有问题。我希望你看看。谢谢。
  • 不,我的意思是html.xpath('substring-after(//div/p/text()[starts-with(., "Fax:")], "Fax: ")')
  • 没办法。我遇到过的最好的解决方案。您也使用此表达式进行了拆分。现在我得到的只是号码。最后一件事要敦促先生 - 如果我想到达“地址”,这个表达会是什么样子,因为那里没有标志。提前致谢。
  • 我认为这样的事情应该可以工作//h4[.="Address"]/following-sibling::p[1]/text()
  • 在此之前,我以为我对 xpath 有所了解,但您消除了我的困惑。我很确定我对此一无所知。再次感谢先生。
【解决方案2】:

见: - Get the inner HTML of a element in lxml

由于键值是非结构化的,这将是不可靠的,但有可能做一个

for x in inner_html.split('<br>'):
    if ':' in x:
        yield x.split(':')[0], x.split(':')[1]
    else:
        yield 'unknown', x

或类似的东西,但是您必须添加某种逻辑来对键值进行排序。我不确定正则表达式是否合适,因为不能保证数据的结构,所以逻辑会很脆弱,但是一些黑客可能在这里起作用。

为了给它更多的结构,您可以使用 xpath 选择,例如:

//div.contact-details/descendant-or-self::h4[text()='Address']//p

【讨论】:

  • 感谢 jmunsch,您的回答。除了选择器之外,我不打算寻找任何替代品。价值对我来说并不重要。但是,我想知道使用选择器获取结果的过程。我已经使用 xpath 找到了电话号码、传真等。对于电话,这个表达式就足够了: ("//div[contains(@class,'contact-details')]//p/text()")[1] 。还有一件事——你的 xpath 返回错误。
  • @SMth80 没问题。我没有测试它。更多的是让您了解如何让它发挥作用。
猜你喜欢
  • 1970-01-01
  • 2021-12-31
  • 2015-07-17
  • 2017-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多