如何使用选择器获取某些特定文本?

时间:2017-07-29 19:47:46

标签: python web-scraping css-selectors lxml

如何使用python与css选择器结合使用“phone”和“fax”。我选择了“名字”但是在“电话”和“传真”的情况下我被卡住了。任何有关这方面的帮助将受到高度赞赏。提前谢谢。

我尝试过:

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>

2 个答案:

答案 0 :(得分: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: ")

答案 1 :(得分:0)

请参阅:   - 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