问题:我想从页面中提取电话号码。每个号码都隐藏在名为"显示联系信息"的按钮下。在单击按钮之前,在dom中找不到这些数字。单击该按钮时,该按钮将被电话号码替换。
是否有可靠的方法在页面上按位置查找元素?如果是,那么我可以获取按钮的位置,单击它,然后在按钮位置获取电话号码。
以下是页面:https://sfbay.craigslist.org/pen/apa/5753779484.html 一段时间后,此页面将被删除。当发生这种情况时,我可以提供类似的页面。
感谢。
我也尝试过只使用xpath而且失败了:
1 - 获取"之前的第一个兄弟元素;显示联系信息"的按钮。
2 - 使用1中的元素,单击按钮。按钮被电话号码取代。
3 - 再次使用1中的元素,获取电话号码的文字。
代码:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.ArrayList;
import java.util.List;
public class Temp {
private static WebDriver browser = new ChromeDriver();
public static List<String> get_phone_numbers() {
String url = "https://sfbay.craigslist.org/pen/apa/5753779484.html";
browser.get(url);
List<String> phones = new ArrayList<String>();
String text;
String phone;
WebElement contact;
String before_contact_buttons_xpath = "//*[@id='postingbody']/a[contains(., 'show contact info')]/" +
"preceding-sibling::*[1]";
//Get all the preceding sibling elements of "show contact info button."
List<WebElement> pre_contacts = browser.findElements(By.xpath(before_contact_buttons_xpath));
for (WebElement pre_contact : pre_contacts) {
//Click the "show contact info" button. It disappears after click & is replaced by an phone number.
WebElement temp_contact_btn = pre_contact.findElement(By.xpath("following-sibling::*[1]"));
System.out.println(temp_contact_btn.getText());
temp_contact_btn.click();
//Now get the number from the replaced "show contact info" button.
contact = pre_contact.findElement(By.xpath("following-sibling::*[1]"));
text = contact.getText();
System.out.println(text);
phone = "000-111-2222";//extract_phone_number(text);
phones.add(phone);
}
return phones;
}
public static void main(String[] args) {
List<String> phones = get_phone_numbers();
}
}
输出:
show contact info
show contact info
答案 0 :(得分:1)
在该页面上,单击按钮(实际上是<a>
)会触发XMLHttpRequest
,重新加载描述部分的全部内容。它似乎只是对<a>
的{{1}}:https://sfbay.craigslist.org/fb/sfo/apa/5753779484做了GET请求。尝试转到该链接或右键单击“按钮”并在新选项卡中打开链接。
获得href
元素之后,我建议在<a>
请求页面,然后以某种方式解析内容以获取电话号码。假设没有任何其他电话号码,这对正则表达式来说不会太难。