Xpath to Extract Text After Br Tags in R

XPath to extract text after br tags in R

It helps if you realize text is a node too. All text in the div than follows <br/>'s can be retrieved by:

//div[@id="population"]/text()[preceding-sibling::br]

Technically, between <br/> tags would mean:

//div[@id="population"]/text()[preceding-sibling::br and following-sibling::br]

... but I guess that's not what you want at this point.

XPath for text after br/

In XPath 1.0, given a node-set, contains() would only evaluates the first node in the set. That's why your initial XPath successfully find text node that contains '$3.00', but not the one that contains '$2.00'.

XPath expression that is close to the way your xpath of $3.00 works would be as follow :

//table[tbody/tr[2]/td/table/tbody/tr/td[2]/text()[contains(.,'$2.00')]]

The XPath above works by applying contains() on individual text node instead of passing multiple text nodes at once.

How to extract text between tags containing unwanted BR tags with xpath and python?

You can use the following XPath :

//div[@itemprop="description"]/text()[not(position()=last())][preceding-sibling::*[2][self::br]][normalize-space()]

Code :

data = """HTML
<div class="text" itemprop="description">jung<br><br>Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.<br><br>Weitere Angaben: Rüde, EU-Heimtierausweis, entwurmt, gechipt, geimpft, nur für Hundeerfahrene, verträglich mit Katzen, Familienhund, kinderfreundlich.</div>
HTML"""

import lxml.html
tree = lxml.html.fromstring(data)
print (tree.xpath('//div[@itemprop="description"]/text()[not(position()=last())][preceding-sibling::*[2][self::br]][normalize-space()]'))

Output :

['Wunderschöner, sanfter Pyrenäenberghund Rüde schweren Herzens abzugeben. Rudi ist Anfang Juli letzten Jahres bei uns geboren und hat sich mittlerweile zu einem stattlichen jungen Mann entwickelt. Er ist ein total freundliches Kerlchen im Umgang mit seinen Mitmenschen, egal ob groß oder klein, und versteht sich auch mit Katzen und anderen Tieren wie auch z.B. Ziegen. Es kristallisierte sich auch schnell heraus, dass er der intelligenteste unserer 11 Welpen war. Sitz und Platz klappte innerhalb kürzester Zeit, da er sehr lernwillig ist. Er hat bis März bei uns gelebt und war dann für 1,5 Monate in einer anderen Familie, wo es aber leider Probleme innerhalb des Rudels gab und die neuen Besitzer ihn daher wieder zu uns gegeben haben. Es war aber nicht seine Schuld, dass es nicht funktioniert hat, er hat sich nicht falsch verhalten. Wir wünschen uns für ihn, dass er einen Platz findet, wo man die Eigenschaften eines Herdenschutzhundes zu schätzen und lieben weiß. Deshalb ist es uns sehr wichtig, dass die neuen Besitzer bereits Erfahrung mit Herdenschutzhunden haben. Außerdem wäre es schön, wenn er einen Partner zum Spielen hätte, da er es als Einzelhund nicht kennt. Rudi ist selbstverständlich gechippt, geimpft und entwurmt.']

Tested OK with :

  • https://www.quoka.de/tiermarkt/hunde/c5030a285861882/pyrenaeenberghund-ruede.html
  • https://www.quoka.de/tiermarkt/hunde/c5030a287343999/vorwitzige-west-highland-terrier-welpen.html
  • https://www.quoka.de/tiermarkt/hunde/c5030a287685487/shih-tzu-welpen-bleiben-klein.html
  • https://www.quoka.de/tiermarkt/hunde/c5030a287859602/chihuahua-welpen-huendinnen.html

EDIT : XPath explanation :

We look for text nodes child of a specific div. The text nodes has to fulfill the following conditions :

  • not to be the last text node (to exclude "Weitere Angaben...")
  • the second preceding sibling element of the text node has to be a br element (to exclude the first text elements like dog breed and statut)

That way, the XPath expression select the text nodes after the first two consecutive br (<br/><br/>) and stop before the last text node.

How to write xpath for the text enclosed in the br tags?

I think you can't get text from <br/> tag, it's line breaks. So in your case, you can use the xpath : //*[@class='abc'] for get all text. But if you want get text each line, may this is need to try :

WebElement elemnt = driver.findElement(By.xpath("//*[@class='abc']"));

String lines[] = elemnt.getText().split("\\r?\\n");
for(String line: lines) {
System.out.println("line :" +line);
}

Implement in java.

Output console :

console

How to use xpath for extracting text between br/ tag

Alternative solution using normalize-space()

//span[@class="ms-cui-ctl-largelabel" and normalize-space()="New Map"]

How to get between two br tags in xpath?

You can select the text child nodes in the span element with span/text() so assuming your posted path selects the td containing the span you want //tr[3]//td[2]/span/text().

Here is a sample:

$html = <<<EOD
<html>
<body>
<table>
<tr>
<td>1</td>
</tr>
<tr>
<td>2</td>
</tr>
<tr>
<td>3,1</td>
<td>
<span> Washington US <br>98101 Times Square</span>
</td>
</tr>
</body>
</html>

EOD;

$doc = new DOMDocument();
$doc->loadHTML($html);

$xpath = new DOMXPath($doc);

$textNodes = $xpath->query('//tr[3]//td[2]/span/text()');

foreach ($textNodes as $text) {
echo $text->textContent . "\n";
}

Outputs

 Washington US 
98101 Times Square


Related Topics



Leave a reply



Submit